Ограничения анонимных типов:
- У них могут быть только общедоступные свойства, доступные только для чтения.
- У них нет методов или других членов типа
- Вы можете привести анонимный тип только к объекту
- Если два анонимных типа имеют одинаковое определение, они рассматриваются компилятором как один и тот же тип и используют одни и те же метаданные.
Есть несколько способов инициализации анонимных типов. Некоторые из них приведены ниже:
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));
Синтаксисы лямбда-выражений
- Вы можете указать параметры в скобках, если вам нужно указать более одного параметра:
(car, engineSize) => car.engine >= engine Size
- Вы можете указать типы параметров, чтобы избежать путаницы
<code> (ClassCar car, int engineSize) => car.engine >= engine Size</code>
- У вас может быть лямбда-выражение без параметров:
<code> () => Console.WriteLine("Parameter less lambda");</code>
- Если у вас есть несколько операторов в теле, они должны быть в фигурных скобках:
x =>
{
Console.WriteLine("Few statements lambda");
return x*x;
}- Вы можете использовать локальную переменную в теле выражения, которая будет видна только внутри вашего лямбда-выражения.
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, цель которых находится вне тела или в теле содержащейся анонимной функции.
Комментариев нет:
Отправить комментарий