我已经快速阅读了Microsoft Lambda表达式文档。
不过,这样的例子帮助我更好地理解:
delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25
不过,我还是不明白为什么这是一种创新。它只是一个在“方法变量”结束时死亡的方法,对吧?为什么我要用这个而不是真正的方法?
我已经快速阅读了Microsoft Lambda表达式文档。
不过,这样的例子帮助我更好地理解:
delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25
不过,我还是不明白为什么这是一种创新。它只是一个在“方法变量”结束时死亡的方法,对吧?为什么我要用这个而不是真正的方法?
当前回答
Lambda表达式对于匿名委托来说是一种更简单的语法,可以在任何可以使用匿名委托的地方使用。然而,反过来就不对了;lambda表达式可以转换为表达式树,这允许很多魔术,如LINQ到SQL。
下面是一个使用匿名委托的LINQ to Objects表达式的例子,然后是lambda表达式,以显示它们是多么容易。
// anonymous delegate
var evens = Enumerable
.Range(1, 100)
.Where(delegate(int x) { return (x % 2) == 0; })
.ToList();
// lambda expression
var evens = Enumerable
.Range(1, 100)
.Where(x => (x % 2) == 0)
.ToList();
Lambda表达式和匿名委托相对于编写单独的函数有一个优势:它们实现了闭包,允许您将局部状态传递给函数,而无需向函数添加参数或创建一次性对象。
表达式树是c# 3.0的一个非常强大的新特性,它允许API查看表达式的结构,而不仅仅是获取一个可以执行的方法的引用。API只需要将委托参数转换为Expression<T>参数,编译器就会从lambda而不是匿名委托生成表达式树:
void Example(Predicate<int> aDelegate);
被称为:
Example(x => x > 5);
就变成:
void Example(Expression<Predicate<int>> expressionTree);
后者将获得描述表达式x > 5的抽象语法树的表示。LINQ to SQL依赖于此行为,能够将c#表达式转换为服务器端过滤/排序等所需的SQL表达式。
其他回答
Lambda清理了c# 2.0的匿名委托语法…例如
Strings.Find(s => s == "hello");
在c# 2.0中是这样完成的:
Strings.Find(delegate(String s) { return s == "hello"; });
在功能上,它们做的是完全相同的事情,只是语法更简洁。
Lambda表达式是表示匿名方法的一种简洁方式。匿名方法和Lambda表达式都允许您内联定义方法实现,但是,匿名方法显式地要求您定义方法的参数类型和返回类型。Lambda表达式使用c# 3.0的类型推断特性,该特性允许编译器根据上下文推断变量的类型。这是非常方便的,因为这节省了我们大量的输入!
您还可以在编写作用于方法的泛型代码时使用lambda表达式。
例如:计算方法调用所花费的时间的泛型函数。(即这里的动作)
public static long Measure(Action action)
{
Stopwatch sw = new Stopwatch();
sw.Start();
action();
sw.Stop();
return sw.ElapsedMilliseconds;
}
你可以使用lambda表达式调用上述方法,如下所示,
var timeTaken = Measure(() => yourMethod(param));
表达式允许您从方法和out参数中获取返回值
var timeTaken = Measure(() => returnValue = yourMethod(param, out outParam));
例如,Lambda表达式使任务简单得多
var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var oddNumbers = numbers.Where(x => x % 2 != 0);
var sumOfEven = numbers.Where(x => x % 2 == 0).Sum();
在上面的代码中,因为我们使用了lambda,所以我们在一行代码中得到奇数和偶数的和。
如果没有lambda,我们将不得不使用if/else或for循环。
因此,使用lambda来简化c#中的代码是很好的。
一些关于它的文章:
https://qawithexperts.com/article/c-sharp/lambda-expression-in-c-with-examples/470
https://exceptionnotfound.net/csharp-in-simple-terms-18-expressions-lambdas-and-delegates
http://dontcodetired.com/blog/post/Whats-New-in-C-10-Easier-Lambda-Expressions
这是一种将小操作放在非常接近使用位置的地方的方法(与在接近使用点的地方声明变量没有什么不同)。这将使您的代码更具可读性。通过匿名化表达式,如果在其他地方使用了该函数并对其进行了修改以“增强”它,那么其他人就很难破坏您的客户端代码。
同样,为什么需要使用foreach?你可以用一个简单的for循环来完成foreach中的所有事情,或者直接使用IEnumerable。答案:你不需要它,但它使你的代码更可读。