LINQ - это широкое технологическое имя, охватывающее большую часть .NET 3.5 и изменения в C # 3.0; "запрос на языке" и т. д.
Делегат сравним с указателем на функцию; «дескриптор метода» как объект, если хотите, т.е.
Func<int,int,int> add = (a,b) => a+b;
- это способ написания делегата, который я затем могу вызвать. Делегаты также поддерживают события и другие методы обратного вызова.
Анонимные методы - это сокращение 2.0 для создания экземпляров делегатов, например:
someObj.SomeEvent += delegate {
DoSomething();
};
они также вводили полное замыкание в язык через «захваченные переменные» (не показано выше). В C # 3.0 введены лямбды, которые могут производить так же, как анонимные методы:
someObj.SomeEvent += (s,a) => DoSomething();
, но который также может быть скомпилирован в деревья выражений для полного LINQ для (например) базы данных. Например, вы не можете запустить делегат от SQL Server! но:
IQueryable<MyData> source = ...
var filtered = source.Where(row => row.Name == "fred");
можно преобразовать в SQL, так как он скомпилирован в дерево выражений (System.Linq.Expression
).
Итак:
- анонимный метод может использоваться для создания делегата
- лямбда может быть тем же, что и анон-метод, но не обязательно