1.C#之2.0(在整理当中)

     以前的十八章都是C#1.0所引入的内容,接下来写C#2.0引入的几项语言扩展,2.0引入的重要的是泛型、匿名方法、迭代器、不完整类型:

          泛型:可以让类、结构、接口、委托和方法通过它们所存储和操作的数据的类型被参数化;它们提供了更强的编译时类型检查,减少了显示转换,装箱操作和运行时类型检查;

          匿名方法:让代码以内联的方式潜入到期望委托值得地方。它与Lisp编程语言中的λ函数(lambda)相似。C#2.0支持"closures"的创建,在其中匿名方法可以访问相关布局变量和参数;

          迭代器:可以递增计算和产生值的方法。迭代器让类型指定foreach语句如何迭代它的所有元素变得很容易;

          不完整类型:可以让类、结构、接口被拆分成多个部分存储在不同的源文件中,这更利于开发和维护;此外,不完整类型允许某些类型的机器生成的部分与用户编写的部分之间的分离,从而使增加由工具产生的代码很容易。

     C#2.0的语言扩展主要被设计用于确保与现存的代码之间最大的兼容性。

  19.1泛型

   19.1.1 为什么使用泛型

     如果没有泛型,通用目的的数据结构可以采用object类型存储任何类型的数据。比如Stack类在一个object数组中存储数据,它的两个方法使用object接受和返回数据:

     这样虽然让Stack类更加灵活,但还是有缺点。比如你可以用任何类型的值压入Push堆栈,但取回一个值是,Pop方法的结果必须被显示强制转换为合适的类型,这样为了一个运行时类型检查去编写代码而带来的性格不利影响是很讨厌的。这种装箱和拆箱的操作增加了性能开销,因为它们涉及动态内存分配和运行时类型检擦。

     Stack类更大的问题是它不能强制放置在堆栈上的数据结构,比如用Customer实例可以压入堆栈,但取回时可能被强制转换为错误的类型:

     虽然上面的代码时Stack类的一种不恰当用法,但代码从技术上说是正确的,并不会报告编译时错误,问题会知道代码执行时才会冒出来,抛出一个InvalidCastException异常。

     但如果Stack类具有指定其元素类型的能力,那么很显然它能从这种能力得到好处。泛型,使这变得可能。

   19.1.2 创建和使用泛型

     发

猜你喜欢

转载自www.cnblogs.com/dreamoffire/p/10166281.html
今日推荐