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

我眼中的C# 3.0

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

你是如何为对象扩展与之相关的功能的?

  我一直在想,为什么String类没有提供一个Reverse()方法,把字符串翻转呢?我猜可能是因为这种操作没有什么现实意思,除非你要做一个文字游戏。实现Reverse()方法并不难,下面是其中一种做法:

代码 16

  使用方法也非常简单:

代码 17

  你甚至可以把Reverse()方法放到某个静态类里,例如Utils,这样,代码17就可以变成:

代码 18

  在C# 3.0之前,你最多只能走到这里,而到了C# 3.0,你还可以使用扩展方法对它做进一步调整,使代码18变成:

代码 19

  怎么样,看上去就像Reverse()方法是属于String的,而你所需要做的仅仅是在Reverse()方法的target参数前面加上"this"关键字:

代码 20

  我们知道,计算机的底层世界并不知道什么是面向对象,而我 们在对象里定义的实例方法都包含一个隐藏参数,这个参数就是指向当前对象实例的指针,C# 3.0的扩展方法在形式上模仿了这种做法,但由于扩展方法本质上并不属于与之相关的类,所以你无法在扩展方法里访问类内部的私有成员。

  就上面的讨论来说,你可能认为,和代码18相比,代码19并没有太大的优势,那么为什么需要扩展方法呢?假设我们手头上有一堆书,我想找到最便宜的LINQ的书,使用标准查询运算符的话可以这样写:

代码 21

  我们知道,Where()、OrderBy()和First()等都是扩展方法,如果C# 3.0不支持扩展方法,那么代码21就不得不写成这样了:

代码 22

  代码21的可读性明显比代码22的高,也显得更自然,而此时我们只是使用了3个标准查询运算符,你可以想象一下,在没有扩展方法的支持下要表达更复杂的查询会是怎样一番情景?

1
0
标签:C#

.NET技术热门文章

    .NET技术最新文章

      最新新闻

        热门新闻