Интересно о C#: возможности, которые мы редко используем
Мне нравится, что данная рубрика находит своего читателя. Также мне нравится, что вы критикуете материал, указываете на ошибки и тем самым заставляете заново переосмысливать написанное. Значит, мы на правильном пути.
Сегодня поговорим о тех возможностях языка, которые мы используем редко или вообще о них не догадываемся, но они есть (с). Это материал из C# basics, но тем не менее, будет полезен каждому, кто программирует на C#.
switch
Кроме привычного break для выхода из switch можно также использовать return, throw и даже goto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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. Но на самом деле это возможно - для этого необходимо перед названием добавить символ "@":
1 2 3 4 | class @ class { public string @ delegate { get ; set ; } } |
А потом написать в коде:
1 2 | @ class c = new @ class (); c.@ delegate = "some cool value" ; |
Сделано это потому, что в разных .NET языках присутствуют разные зарезервированных слова, поэтому такая возможность добавлена для нормального вызова кода написанного, например на C# из VB.NET проектов, и наоборот.
Ключевые слова checked и unchecked
Выражение или блок, помеченный как checked будет проверять контекст, соответственно unchecked будет его игнорировать.
Следующий пример выдаст OverflowException:
1 2 3 4 | short x = short .MaxValue; short y = short .MaxValue; short z = checked (( short )(x + y)); |
А этот вернет -2:
1 2 3 4 | short x = short .MaxValue; short y = short .MaxValue; short z = unchecked (( short )(x + y)); |
Значения по умолчанию и default
Не смотря на то, что значения по умолчанию запомнить достаточно легко (для численных типов - 0, ссылочных - null, для bool - false), C# имеет возможность задать это значение с помощью default:
1 2 3 | int i = default ( int ); // 0 bool b = default ( bool ); // false DateTime t = default (DateTime); // 01.01.0001 0:00:00 |
Как часто вы используете вышеперечисленные возможности?