C# 2.0会给我们带来什么

现如今C#3.0都已经吵得沸沸扬扬了,很多人还没开始研究C#2.0,源于CSDN上一个热贴的讨论,我决定对C#2.0的主要新特性做一个入门级别的简单介绍:

其实语言的改进主要是为了在编译器允许的情况下切合人的思考方式并减少工作量。

我在实际项目中用过的C#2.0语言扩展主要是匿名方法,泛型,不完全类型,和改进的迭代器:

 

1、关于匿名方法:

以前所有的事件响应都是分成两部分,先定义一个委托然后绑定到事件处理函数。我们经常看到类似下面的代码:

              this.button1.Click += new System.EventHandler(this.button1_Click);

                ................

                ................

              private void button1_Click(object sender, System.EventArgs e)

              {

                     MessageBox.Show("您点击了一个按钮");

              }

C#2.0中,可以直接在原来定义委托的地方直接编写以一个delegate关键字开头的匿名方法,用如下代码即可实现同样功能:

        button1.Click+=delegate{MessageBox.Show("您点击了一个按钮");};

如果这个匿名方法的委托类型编译器认不出来,可以用强制类型转换,如:

Delegate delebutton1click=(EventHandler)delegate{MessageBox.Show("您点击了一个按钮");};

匿名方法还可以捕获或引用其它方法的参数、局部变量、属性等,代码量明显减少,套句广告词就是“简单方便又实惠”。

 

2.泛型:

以前通用的数据结构只能用object类型来存贮各种类型的数据。在C#2.0里通过某个类型建立的Stack<T>的实例,可以接受各种类型的数据,类型参数T就像个占位符,直到使用时才指定一个实际的类型。

关于泛型大家可以参见速马在上海.Net俱乐部活动上讲泛型用过的ppt

明了易懂。个人觉得泛型是C#2.0带给我们最重要的语言扩展。

 

3.不完全类型(有的人翻译成不完整类型):

不完全类型可以使一个类在类型修饰符partial修饰下在不同部分实现。如:

我们以前实现类时用的

                public class Class1

                {

                       ...........(这是一段语句)

                       ,,,,,,,,,,,(另一段语句)                       

                }

C#2.0里我们可以通过

 

              public partial class Class1

              {

                     ...........

              }

 

              public partial class Class1

              {

                     ,,,,,,,,,,,

              }

来实现,甚至这几个部分可以在不同的源文件中。要注意的是不完全类型的所有部分要一块儿编译,同时,不完全类型不允许对已经被编译的类型进行扩展。团队开发的时候,不完全类型很有用。

 

4.迭代器

C#foreach语句是VB那里学来的,被用于迭代一个可枚举集合的所有元素。为了可以被枚举,集合必须具有一个无参数GetEnumerator()方法,它返回一个枚举器。一般情况下,枚举器实现麻烦。在C#1.x里对于值类型集合在foreach时,每个值都经历装箱和拆箱操作,引用类型集合在foreach时也有个多余的castclass指令来保证枚举出来的值进行类型转换时不发生错误。但这个问题在C#2.0中使用迭代器就方便多了。比如原来C#1.x中的下列语句

              using System.Collections;

              public class Tokens : IEnumerable

              {

               ...

                Tokens f = new Tokens(...);

                foreach (string item in f)

                {

                   Console.WriteLine(item);

                }

                ...

              }

C#2.0中提供了强类型的泛型IEnumerable定义,所以可以写成

              namespace System.Collections.Generic

              {

                public interface IEnumerable<ItemType>

                {

                   IEnumerator<ItemType> GetEnumerator();

                }

                public interface IEnumerator<ItemType> : IDisposable

                {

                   ItemType Current{get;}

                   bool MoveNext();

                }

              }

这样就既能保证遍历集合时的类型转换是安全无误的,同时又能避免冗余转换,使效率提高。

 

5.C#2.0还有其它的一些新特性,如新增了static class,我的理解就相当于以前有人想定义的abstract sealed class,只不过规定好static这个关键字不会引起歧义。等等。欢迎大家补充。

posted on 2005-12-08 19:11 Zeus 阅读(2222) 评论(14)  编辑 收藏 网摘 所属分类: CSDN释疑

评论

#1楼  2005-12-08 22:12 neoragex2002      

匿名方法个人觉得没什么必要,比较ugly,语法不像语法,模式不像模式。关于其他新特性楼主可以看看李建忠的Csharp2.0锐利体验。实在的说,C#2.0除了范型以外其他方面引入的特性意义均不是很大。C#3.0里面的特性更是离题万里,lambda算子都来了,还有linq也是,恐怕只适合researching吧,真要实用化估计没多少developer能够快速的接受   回复  引用  查看    

#2楼  2005-12-08 22:46 self      

李建忠的C#2.0锐利体验我每集都收听过了,个人觉得匿名方法给我带来了方便,至少减少了代码量。不管什么语法、模式,语言的改进终究是为了解放人的,让沟通更轻松有效的。   回复  引用  查看    

#3楼  2005-12-09 08:54 andyloo      

匿名方法没必要   回复  引用  查看    

#4楼  2005-12-09 08:54 HelloSnoopy      

如果说这就是C#2.0带来的全部特性,那这个1.1->2.0的跨越真是微乎其微的一步!   回复  引用  查看    

#5楼  2005-12-09 08:55 bytes      

C#2.0并没有提供新的解题思想, 只是对习惯的改动. 即使你不了解2.0带来的便利,也一样可以很好地解决问题. 现在的1.0,2.0,3.0,相对Microsoft现在所梦想的终点,只是一个过渡.   回复  引用  查看    

#6楼  2005-12-09 09:04 装配脑袋      

匿名方法作event handler当然丑陋,这样使用说明你根本没有意识到它的价值。yield难道只是给你简化下IEnumerator? 还有泛型,就理解到这种深度,也太对不起微软了。好好挖掘吧。我现在已经离不开这些新特性了,要我现在评价VS.NET 2003里的C#——简直没法用。   回复  引用  查看    

#7楼  2005-12-09 11:27 neoragex2002      

只有语法的变化,但没有语义的进步,都不能算是什么新特性。

楼上的这位是博客堂的ninputer吧,对C#的态度就像十年如一日的用VB一般偏执啊,尽管如此,我相信大家还是很想听听你对C#2.0的实用理解,有空在blog里给大家深入介绍介绍如何?:)   回复  引用  查看    

#8楼  2005-12-09 12:02 idior      

装配脑袋不是说c#2.0不好, 而是说楼主理解得太浅。
比如匿名方法可以来模拟closure,yield甚至可以模拟状态机,而泛型更大大提高了代码的复用性。   回复  引用  查看    

#9楼  2005-12-09 12:07 荡秋千      

老是听到有人说"过渡""过渡""过渡""过渡""过渡"
那我到要问一下:什么时候是个头,微软什么时候可以出个什么终极版???

这种东西是没有尽头的,每个产品都是过渡产品。   回复  引用  查看    

#10楼 [楼主] 2005-12-09 12:44 Zeus      

晕,今天上来一看,成吵架贴了。我承认自己水平有限,但想说明的一点是:我的本意并不是要说好或坏,也不是说C#2.0就这么点东西或者讨论其历史地位。这个贴溯源于CSDN上很多新手不知道C#2.0的一些基本知识,所以我把回复了几次的简单回答合并到一起写成此贴。上面提及的匿名方法、泛型、不完全类型、迭代器等都是在项目中常用的,其他有很多包括空属类型、名称空间别名限定符、定长buffer、Pragma指示符、Conditional特性类、属性访问器保护级别的变化等都没提及,各个新特性都没有做深入介绍。希望大家都能够平和对待。   回复  引用  查看    

#11楼 [楼主] 2005-12-09 12:50 Zeus      

有一点需要特别说明的是:我觉得语言本身并不是特别重要,语言只是实现目的的工具,最重要的东西在语言之外。如果大家还停留在对语言这般那般的批驳比较,意义不大。哪位大师都不止深入一门语言。
我想,总有一天计算机语言会进化成人类的自然语言,剩下的由编译器去做。   回复  引用  查看    

#12楼  2005-12-09 13:13 zz堪 [未注册用户]

离低层越远的语言一定是没有前途的。机器是物理的东西,你要让物理的东西听你的话只有了解物理层的东西。这是真理。希望C#略靠硬件一点就好了   回复  引用    

#13楼  2005-12-10 09:36 装配脑袋      

别傻了,如果要按照机器的方式做事,还要编译器何用?   回复  引用  查看    

#14楼 [楼主] 2005-12-10 10:36 Zeus      

同意装配脑袋。各种语言有不同的目的和应用场合,并不是离底层越远的语言一定没有前途。找个简单点的,如果zz堪兄可以用汇编写一个类似Biztalk的工作流引擎,小弟一定佩服得五体投地。   回复  引用  查看    





标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-10-26 23:54 编辑过
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接:
 

导航

公告

  •  CSDN :清柳(zeusvenus)

  •  有话说?给我一个Mail

  •  帖子以现状提供,欢迎转载:)

  •  您可以通过狗狗订阅本Blog

  •  The posts are made "AS IS" without warrnties and confers no rights.

  • <2005年12月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    统计

    与我联系

    搜索

     

    常用链接

    留言簿(7)

    我参与的团队

    随笔分类(18)

    随笔档案(196)

    文章分类(7)

    新闻分类

    相册

    我参与的团队

    最新评论

    阅读排行榜

    评论排行榜