четверг, 30 декабря 2021 г.

Анонимные типы лямбда-выражения

 Ограничения анонимных типов:

  • У них могут быть только общедоступные свойства, доступные только для чтения.
  • У них нет методов или других членов типа
  • Вы можете привести анонимный тип только к объекту
  • Если два анонимных типа имеют одинаковое определение, они рассматриваются компилятором как один и тот же тип и используют одни и те же метаданные.

Есть несколько способов инициализации анонимных типов. Некоторые из них приведены ниже:


int i = 10;
 string s = "string value";
 var anonym2 = new { int_val = i, string_val = s };
 var anonym3 = new { i, s };
 var anonym4 = new { anonym2, anonym3 };


Построение лямбда-выражения, лямбда-оператора

Когда вы создаете лямбда-выражение, вы должны использовать лямбда-оператор => . Лямбда-оператор отделяет входную переменную с левой стороны от тела лямбда справа. Лямбда-оператор можно прочитать как «идет к». В лямбда-выражении вы помещаете входные параметры, если они у вас есть, слева от оператора, а выражение или оператор - с правой стороны от лямбда-оператора. Итак, лямбда-выражение выглядит так:

<аргументы, если есть> => <выражение>

или

<аргументы, если есть> => <блок операторов>


Ниже приведен пример замены делегата лямбда-функцией:

//Declarign the delegate:

    public delegate int MyDelegate(string s, int i);

//Implement the caller and delegate:

        public static void DelegateCaller(MyDelegate input)
        {
            int res = input("Delegate Caller", 5);
            Console.WriteLine("Delegate result is: " + res);
        }
        public static int DelegateFunction(string s, int i)
        {
            Console.WriteLine("Delegate function string: " + s + " int:" + i);
            return 1;
        }

//calling via delegate and via lambda

            Console.WriteLine("-----------LAMBDA EXPRESSIONS----------------");
            //calling by delegate
            DelegateCaller(new MyDelegate(DelegateFunction));
            //creating lambda delegate
            MyDelegate del = (str, dig) =>
            {
                Console.WriteLine("Delegate lambda string: " + str + " int: " + dig);
                return 2;
            };
            DelegateCaller(new MyDelegate(del));


Синтаксисы лямбда-выражений

  1. Вы можете указать параметры в скобках, если вам нужно указать более одного параметра:
(car, engineSize) => car.engine >= engine Size
  1. Вы можете указать типы параметров, чтобы избежать путаницы
<code>                 (ClassCar car, int engineSize) => car.engine >= engine Size</code>
  1. У вас может быть лямбда-выражение без параметров:
<code>                 () => Console.WriteLine("Parameter less lambda");</code>
  1. Если у вас есть несколько операторов в теле, они должны быть в фигурных скобках:
x =>

{

   Console.WriteLine("Few statements lambda");

   return x*x;

}
  1. Вы можете использовать локальную переменную в теле выражения, которая будет видна только внутри вашего лямбда-выражения.
x =></code>

<code>{</code>

<code>   DateTime date = DateTime.Now;</code>

<code>   return x + date.DayOfYear;</code>

<code>}

 

Область видимости переменной в лямбдах

В лямбдах вы можете ссылаться на переменные, которые находятся в области метода, в котором они определены, и в типе, в котором они определены. Если вы будете использовать такую ​​переменную в области лямбда-выражения, она будет сохранена в памяти для лямбда-выражения, даже если в других случаях это будет сборщик мусора. См. Пример ниже, который демонстрирует, как локальная переменная в методе, в котором определена лямбда, все еще находится в памяти с правильным значением, даже если в обычных случаях она не будет работать:

//declaring delegate:

    public delegate int SomeDelegate(int input);

//implementing sample function

        public void ScopeExample()
        {
            //local variable that will be hold for delegate
            //even after ScopeExample is running out of the
            //scope and released from memory
            int j = 5;
            m_del = (x) =>
            {
                Console.WriteLine("Input parameter is : " + x);
                Console.WriteLine("Local variable is: " + j);
                return j + x;
            };
            int i = m_del(5);
            Console.WriteLine("Delegate internal result is: " + i);
        }

//testing

            //delegates variable scope
            Program test = new Program();
            test.ScopeExample();
            int k = test.m_del(10);
            Console.WriteLine("Delegate external result is: " + k);

 

Вы можете скачать приложенные исходники, чтобы поиграть с ним

Я копирую ниже правила MSDN для области видимости переменных в лямбдах:

  • Захваченная переменная не будет собираться мусором до тех пор, пока делегат, который на нее ссылается, не выйдет за пределы области видимости.
  • Переменные, представленные в лямбда-выражении, не видны во внешнем методе.
  • Лямбда-выражение не может напрямую захватывать параметр ref или out из включающего метода.
  • Оператор return в лямбда-выражении не вызывает возврата включающего метода.
  • Лямбда-выражение не может содержать оператор goto, оператор break или continue, цель которых находится вне тела или в теле содержащейся анонимной функции.




Комментариев нет:

Отправить комментарий

Паттерн 'Репозиторий' в ASP.NET

  Последнее обновление: 1.11.2015         Одним из наиболее часто используемых паттернов при работе с данными является паттерн 'Репозито...