Интересно о C#: возможности, которые мы редко используем
Мне нравится, что данная рубрика находит своего читателя. Также мне нравится, что вы критикуете материал, указываете на ошибки и тем самым заставляете заново переосмысливать написанное. Значит, мы на правильном пути.
Сегодня поговорим о тех возможностях языка, которые мы используем редко или вообще о них не догадываемся, но они есть (с). Это материал из C# basics, но тем не менее, будет полезен каждому, кто программирует на C#.
switch
Кроме привычного break для выхода из switch можно также использовать return, throw и даже goto:
switch(value) { case 0: //do something break; case 1: //do something return; case 2: //do something throw new ArgumentException(); case 3: //do something goto case 0; default: break; }
Class для имени класса
Известно, что вы не можете называть переменные именами зарезервированных слов, например class или delegate. Но на самом деле это возможно - для этого необходимо перед названием добавить символ "@":
class @class { public string @delegate { get; set; } }
А потом написать в коде:
@class c = new @class(); c.@delegate = "some cool value";
Сделано это потому, что в разных .NET языках присутствуют разные зарезервированных слова, поэтому такая возможность добавлена для нормального вызова кода написанного, например на C# из VB.NET проектов, и наоборот.
Ключевые слова checked и unchecked
Выражение или блок, помеченный как checked будет проверять контекст, соответственно unchecked будет его игнорировать.
Следующий пример выдаст OverflowException:
short x = short.MaxValue; short y = short.MaxValue; short z = checked((short)(x + y));
А этот вернет -2:
short x = short.MaxValue; short y = short.MaxValue; short z = unchecked((short)(x + y));
Значения по умолчанию и default
Не смотря на то, что значения по умолчанию запомнить достаточно легко (для численных типов - 0, ссылочных - null, для bool - false), C# имеет возможность задать это значение с помощью default:
int i = default(int); // 0 bool b = default(bool); // false DateTime t = default(DateTime); // 01.01.0001 0:00:00
Как часто вы используете вышеперечисленные возможности?