Top.Mail.Ru

Синтаксический сахар 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!

Добавить комментарий

Sidebar