Синтаксический сахар C#
Синтаксический сахар – довольно полезный инструмент для программиста, несмотря на столь пренебрежительно-гламурное название. Для начала, что вообще такое «синтаксический сахар»? Стандартная википедия дает такое определение: «Синтаксический сахар – синтаксические возможности, применение которых не влияет на поведение программы, но делает использование языка более удобным для человека». Вообще, насчет применения синтаксического сахара существует множество противоположных мнений. Кто-то скажет, что это очень мощная штука, облегчающая жизнь, а кто-то возразит, что это излишество, к тому же, мешающее думать.
На самом же деле синтаксический сахар это способ представить длинный код в боле компактном, лаконичном и читабельном виде. Рассмотрим ряд примеров.
Тернарный оператор. Допустим, у нас есть некоторое условие, в зависимости от которого мы присваиваем значение переменной:
static void Main(string[] args) { int val = 1; string my_var="Число "; if (val > 0) { my_var = my_var + "положительное"; } else { my_var = my_var + "отрицательное"; } Console.WriteLine(my_var); Console.ReadLine(); }
Благодаря тернарному оператору, весь код можно записать короче:
static void Main(string[] args) { int val = 1; string my_var="Число "; my_var = my_var + (val > 0 ? "положительное" : "отрицательное"); Console.WriteLine(my_var); Console.ReadLine(); }
Операции +=,-=,*=,/*. На самом деле и этот код можно сократить:
static void Main(string[] args) { int val = 1; string my_var="Число "; my_var += (val > 0 ? "положительное" : "отрицательное"); Console.WriteLine(my_var); Console.ReadLine(); }
Краткая проверка на null. В данном примере на null переменная проверяется условным оператором:
namespace Sugar1 { public class MyClass { public void some_method() { Console.WriteLine("Calling some_method"); } } class Program { static void Main(string[] args) { MyClass a = null; if(a!=null) { a.some_method(); } Console.ReadLine(); } } }
Сокращенный вариант:
public class MyClass { public void some_method() { Console.WriteLine("Calling some_method"); } } class Program { static void Main(string[] args) { MyClass a = null; a?.some_method(); Console.ReadLine(); } }
Замечу, что в старых версиях C#, например в той версии, которая в Visual Studio 2010 данный синтаксис не работает. В версии Visual Studio 2015 Он уже есть. В промежуточных – не знаю, не проверял.
Кто-то, возможно, спросит, для чего делать проверку на null? А для того, чтобы программа не вылетела с исключением, так как у не инициализированного указателя мы не можем вызвать метод – объекта то еще не существует.
Псевдонимы. Предположим, что у нас сесть тип со множеством вложенных нэймспейсов, например вот такой Domen.Submomen.SubSubDomen.MyClass, см пример:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace sugar2 { class Program { static void Main(string[] args) { Domen.Submomen.SubSubDomen.MyClass a = new Domen.Submomen.SubSubDomen.MyClass(); a.some_methon(); Console.ReadLine(); } } }
Можно сделать код более лаконичным, введя псевдоним:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using MyClassAlias = sugar2.Domen.Submomen.SubSubDomen.MyClass; namespace sugar2 { class Program { static void Main(string[] args) { MyClassAlias a = new MyClassAlias(); a.some_methon(); Console.ReadLine(); } } }
Переменное число аргументов. Очень удобно, когда в функции можно указать любое число аргументов, например, для вывода их на печать (как команда print в старом добром бэйсике), или, например, просуммировать эти аргументы. C# позволяет подобные выкрутасы. Правда, все аргументы типизированы, но это можно обойти, елси тип сделать object. Давайте рассмотрим парочку примером. Сначала суммирование:
static int sum(params int[] numbers) { int res = 0; foreach (int a in numbers) { res += a; } return res; }
Функция суммирует аргументы типа int. Пример использования:
Console.WriteLine(sum(1, 2, 3)); Console.WriteLine(sum(8, 1, 1,5));
А вот функция с любым типом аргументов (выводит на печать):
static void print(params object[] objs) { foreach (object a in objs) { Console.Write(a); } }
Пример использования:
print(1, " число равно=", 2.3);
Перечисление флагов. Очень интересная возможность. Есть в C# такая конструкция, как перечисления, которая позволяет задавать именованные числовые константы. Например:
public enum Color { Red, Yellow, Green }
Теперь, если нам надо закодировать, например, красный цвет, мы можем обратиться к Colors.Red:
Colors color = Colors.Red;
А потом проверить его, например, в операторе условия или в свитче:
switch (color) { case Colors.Red: Console.WriteLine("Красный"); break; case Colors.Green: Console.WriteLine("Зеленый"); break; case Colors.Yellow: Console.WriteLine("Желтый"); break; }
Но мало кто знает, что можно сделать перечисления флагов. Например, вот так:
[Flags] public enum MyFlags { flag1=0x0, flag2=0x1, flag3=0x2, flag4 = 0x4 }
Как с ними работать? Например, вот так:
MyFlags a = (MyFlags)3; Console.WriteLine(a);
Программа выдаст:
flag2, flag3
Очень легко проверить наличие флага, используя метод HasFlag:
Console.WriteLine(a.HasFlag(MyFlags.flag3)); Console.WriteLine(a.HasFlag(MyFlags.flag4));
Comments
So empty here ... leave a comment!