您的位置:知识库 » .NET技术

我眼中的C# 3.0

作者: Allen Lee  来源: 博客园  发布时间: 2008-08-14 20:09  阅读: 3613 次  推荐: 1   原文链接   [收藏]  
摘要:每次有新技术发布时,我们总能感受到两种截然不同的情绪:一种是恐惧和抵抗,伴随着这种情绪的还有诸如“为什么要在C# 3.0搞到那么复杂”;另一种则是兴奋和拥抱,伴随着这种情绪的还有诸如"原来这个问题在C# 3.0里可以这么简单!"
[1] 你是如何创建属性的?
[2] 你是如何初始化对象的?
[3] 你是如何把运算逻辑外包出去的?
[4] 你是如何为对象扩展与之相关的功能的?
[5] 你是如何表达你想要的东西的?

你是如何把运算逻辑外包出去的?

  假设我现在得到了一组Book的实例对象,你要对它们进行排序,那么你如何告诉它你要按价格来排序呢?

代码 9

  在C# 1.0里,我们需要特意为它提供一个独立的方法:

代码 10

  然后向Sort()方法传入所需委托的实例:

代码 11

  这在C# 2.0里可以进一步简化为:

代码 12

  如果使用C# 2.0的匿名方法,我们可以省去很多不必要的代码:

代码 13

  此外,使用匿名方法,Sort()方法和你希望它用来比较 两个Book实例对象的逻辑可以放在同一个地方;而使用独立的命名方法,包含这个逻辑的方法可能会由于整理代码而被挪到别的地方。这样,当你看到代码12 时,为了了解它内部的实现,就不得不花一些精力去寻找Compare()方法了。当然,你可以争辩说,我们可以制定一个编码规范,使得Compare() 方法必须紧贴在Sort()方法的下方。是的,你可以,但如果这个逻辑并不需要重用,那么使用匿名方法还是具有明显的优势的。如果这个逻辑需要重用,那么 匿名方法就无能为力了。

  现在,让我们来考察一下代码13,有没有发现匿名方法的表 达方式还不够简练?我们知道,books集合里面只有Book的实例对象,所以Sort()方法传给我们两个参数的类型必定是Book,而Sort()方 法期待的结果正是x.Price.CompareTo(y.Price)这个表达式的运算结果,至于delegate和return这样的字眼可以说在这 里完全是多余的,那么为什么我们不直接这样表达呢:

代码 14

  这就是C# 3.0引入的Lambda表达式语法。我见过一些人,他们通常强调尽可能简单,但若事情突然变得比他们预期的还要简单很多,他们就开始感到不适,甚至拒绝 接受这种简单,其实即使事物的发展方向和你的前进方向相一致,但如果发展速度大大超越了你,仍然有可能引发你内心对失控的恐惧。我希望Lambda表达式 语法不会让你感到太大的不适,当然我更希望你会喜欢上它。

  Lambda表达式的理解其实可以很简单,就是"=& gt;"左边的参数参与右边的表达式运算,而运算结果将会返回,这有点像化合反应,即两种或两种以上的物质(左边的参数)生成一种新物质(右边的表达式的 运算结果),不同的是,Lambda可以不接收任何参数,也可以不返回任何结果。

  "=>"右边除了可以放表达式之外,还可以放语句,像这样:

代码 15

  我们把它称为Lambda语句(Lambda Statement),或许你已经发现,它和匿名方法相比只是不需要写delegate关键字和参数类型。

1
0
标签:C#

.NET技术热门文章

    .NET技术最新文章

      最新新闻

        热门新闻