C#发展的历程C#1.0,C#2.0,C#3.0,C#4.0

1:C#1.0完全是模仿Java,并保留了C/C++的一些特性如struct,新学者很容易上手

2:C#2.0加入了泛型,也与Java1.5的泛型如出一 辙

3:C#3.0加入了一堆语法糖,并在没有修改CLR的情况下引入了Linq,简直是神来之笔,虽然很多项目出于各种各样如性能之类的原因没有采用,但非 常适合小型程序的快速开发,减轻了程序员的工作量,也提高了代码的可读性;

4:C#4.0增加了动态语言的特性,从里面可以看到很多javascript、 python这些动态语言的影子。虽然越来越偏离静态语言的道路,但从另一个角度来说,这些特性也都是为了提高程序员的生产力。至于被接受与否,还是让时 间来说话吧。

4:1

dynamic calc = GetCalculator();
int sum = calc.Add(10, 20);
dynamic的好处在于,可以不去关心对象是来源于COM, IronPython, HTML DOM或者反射,只要知道有什么方法可以调用就可以了,剩下的工作可以留给runtime。
4:2
OpenTextFile(bufferSize: 4096, path: "foo.txt", detectEncoding: false);
4:3

Improved COM Interoperability

在C#中在调用COM对象如office对象时,经常需要写一堆不必要的参数:

object fileName = "Test.docx";
object missing  = System.Reflection.Missing.Value;
doc.SaveAs(ref fileName,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing);

4.0中就可以直接写成:

doc.SaveAs("Test.docx");

C#4.0对COM交互做了下面几方面的改进:

  1. Automatic object -> dynamic mapping
  2. Optional and named parameters
  3. Indexed properties
  4. Optional “ref” modifier
  5. Interop type embedding (“No PIA”)

对第1点和第5点的简单解释如下:

在COM调用中,很多输入输出类型都是object,这样就必须知道返回对象的确切类型,强制转换后才可以调用相应的方法。在4.0中有了dynamic的支持,就可以在导入这些COM接口时将变量定义为dynamic而不是object,省掉了强制类型转换。

PIA(Primary Interop Assemblies)是根据COM API生成的.Net Assembly,一般体积比较大。在4.0中运行时不需要PIA的存在,编译器会判断你的程序具体使用了哪一部分COM API,只把这部分用PIA包装,直接加入到你自己程序的Assembly里面。

缺省参数的用法

比如下面一个TestMethod方法,后面两个参数bar和baz就是缺省参数,默认值分别为“Bar”和“Baz”。

)
   2: {
, foo, bar, baz);
   4: } 

在调用TestMethod的时候,我们自由地选择采用缺省的参数值,或者覆盖该缺省值。

string[] args)
   2: {
);
);
);
   6: }

下面是输出结果:

   1: Foo   - Bar   - Baz
   2: Foo   - Bar1  - Baz
   3: Foo   - Bar1  - Baz1