Effective C#原则49:为C#2.0做好准备

C#2.0,在2005年已经可以使用了,它有一些主要的新功能。这样使得目前使 用的一些最好的实际经验可能会有所改变,这也会随着下一代工具的发布而修改 。尽管目前你还可以不使用这些功能,但你应该这些做些准备。

当 Visual Studio .net2005发布后,会得到一个新的开发环境,升级的C#语言。附 加到这门语言上的内容确实让你成为更有工作效率的开发者:你将可以写更好重 用的代码,以及用几行就可以写出更高级的结构。总而言之,你可以更快的完成 你的工作。

C#2.0有四个大的新功能:范型,迭代,匿名方法,以及部分类型。这些新功能的主要目的就是增强你,做为一个C#开发的开发效率。这一原 则会讨论其中的三个新功能,以及为什么你要为些做准备。与其它新功能相比,范型在对你如何开发软件上有更大的影响。范型并不是C#的特殊产物。为了实现 C#的范型,MS已经扩展了CLR以及MS的中间语言(MSIL)。C#,托管C++,以及 VB.Net都将可以使用范型。J#也将可以使用这些功能。

范型提供了一种 “参数的多太”,对于你要利用同一代码来创建一系列相似的类来说 ,这是一个很神奇的方法。当你为范型参数供一个特殊的类型,编译器就可以生 成不同版本的类。你可以使用范型来创建算法,这些算法与参数化的结构相关的 ,它们在这些结构上实行算法。你可以在.net的Collection名字空间中找到很多 候选的范型:HashTables, ArrayList,Queu,以及Stack都可以存储不同的对象 而不用管它们是如何实现的。这些集合对于2.0来说都是很好的范型候选类型, 这在System.Collections.Generic存在范型,而且这些对于目前的类来说都一个 副本。C#1.0是存储一个对System.Obejct类型的引用,尽管当前的设计对于这一 类型来说是可重用的,但它有很多不足的地方,而且它并不是一个类型安全的。 考虑这些代码:

ArrayList myIntList = new ArrayList( );
myIntList.Add(32 );
myIntList.Add(98.6 );
myIntList.Add ("Bill Wagner" );

这编译是没问题的,但这根本无 法表明你的意思。你是真的想设计这样一个容器,用于存储总完全不同的元素吗 ?或者你是想在一个受到限制的语言上工作吗?这样的实践意味着当你移除集合 里的元素时,你必须添加额外的代码来决定什么样的对象事先已经存在这样的集 合中。不管什么情况,你须要从 System.Object强制转化这些元素到实际的你要 的类型。

这还不只,当你把它们放到1.0版(译注:是1.0,不是1.1)的集 合中时,值类型的开销更特殊。任何时候,当你放到个值类型数据到集合中时, 你必须对它进行装箱。而当你在从集合中删除它时,你又会再开销一次。这些损 失虽然小,但对于一个有几千元素的大集合来说,这些开销就很快的累积起来了 。通过为每种不同的值类型生成特殊的代码,范型已经消除了这些损失。

如果你熟悉C++的模板,那么对于C#的范型就不存在什么问题了,因为这 些从语法上讲是非常相似的。范型的内部的工作,不管它是怎产的,却是完全不 同的。让我们看一些简单的例子来了解东西是如何工作的,以及它是如何实现的 。考虑下面某个类的部份代码:

public class List
{
 internal class Node
 {
  internal object val;
   internal Node next;
 }
 private Node first;
public void AddHead( object t )
 {
  // ...
 }
  public object Head()
 {
  return first.val;
 }
}

时间: 2024-10-27 15:56:34

Effective C#原则49:为C#2.0做好准备的相关文章

Effective C#原则40:根据需求选择集合

"哪种集合是最好的?"答案是:"视情况而定." 不同的集合有不同的性能,而且在不同的行为上有不同的优化..Net框架支持很 多类似的集合:链表,数组,队列,栈,以及其它的一些集合.C#支持多维的数 组,它的性能与一维的数组和锯齿数组都有所不同..Net框架同样包含了很多特 殊的集合,在你创建你自己的集合类之前,请仔细参阅这些集合.你可以发现很 多集合很快,因为所有的集合都实现了ICollection接口.在说明文档中列出了 所有实现了ICollection接口的集合

Effective C#原则8:确保0对于值类型数据是有效的

.Net系统默认所有的对象初始化时都为0.这并没有提供一个方法来预防其他 程序员创建的值类型数据的实例在初始化是都是0.请让你的数据类型默认值也 是0. 一个特殊情况是在枚举类型数据中.决不要创建一个不包括0在内 的枚举类型.所有的枚举类型都是从System.ValueType派生的.枚举类型的值是 从0开始的,但你可以改变这一行为: public enum Planet { // Explicitly assign values. // Default starts at 0 otherwis

Effective C#原则50:了解ECMA标准

ECMA标准是C#语言所有功能的官方说明.ECMA-334定义了C#语言1.0的标准, 你可以从The C# Programming Language这本书上学习C#2.0的计划(译注:现在 已经不是计划了),这本书的作者是Anders Hejlsberg, Scott Wiltamuth, 和 Peter Golde (Addison-Wesley, 2003).这本书是一个语言手册,而不是指南. 它详细说明了这门语言书面定义的每一个功能.每一种语言都只一种标记,可以 让你更加明白每一种语言的

Effective C#原则43:请勿滥用反射

创建二进制的组件时,同时也意味着你要使用迟后绑定和反射来查找你所须 要的具有特殊功能代码.反射是一个很有力的工具,而且它让你可以写出可动态 配置的软件.使用反射,一个应用程序可以通过添加新的组件来更新功能,而这 些组件是在软件最开始发布时没有的.这是有利的. 这一伸缩性也带来 了一些复杂的问题,而且复杂问题的增加又会增加出现其它问题的可能.当你使 用反射时,你是围绕着C#的安全类型.然而,成员调用的参数和返回值是以 System.Object类型存在的.你必须在运行时确保这些类型是正确的.简单的

Effective C#原则42:使用特性进行简单的反射

当你创建了一个与反射相关的系统时,你应该为你自己的类型,方法,以及 属性定义一些自己的特性,这样可以让它们更容易的被访问.自定义的特性标示 了你想让这些方法在运行时如何被使用.特性可以测试一些目标对象上的属性. 测试这些属性可以最小化因为反射时可能而产生的类型错误. 假设你须 要创建一个机制,用于在运行时的软件上添加一个菜单条目到一个命令句柄上.这个须要很简单:放一个程序集到目录里,然后程序可以自己发现关于它的一些 新菜单条目以及新的菜单命令.这是利用反射可以完成的最好的工作之一:你的 主程序须

Effective C#原则41:选择DataSet而不是自定义的数据结构

因为两个原则,把DataSet的名声搞的不好.首先就是使用XML序列化的 DataSet与其它的非.Net代码进行交互时不方便.如果在Web服务的API中使用 DataSet时,在与其它没有使用.Net框架的系统进行交互时会相当困难.其次, 它是一个很一般的容器.你可以通过欺骗.Net框架里的一些安全类型来错误 DataSet.但在现代软件系统中,DataSet还可以解决很多常规的问题.如果你明 白它的优势,避免它的缺点,你就可以扩展这个类型了. DataSet类设计 出来是为了离线使用一些存储

Effective C#原则28:避免转换操作

转换操作是一种等代类型(Substitutability)间操作转换操作.等代类型就 是指一个类可以取代另一个类.这可能是件好事:一个派生类的对象可以被它基 类的一个对象取代,一个经典的例子就是形状继承.先有一个形状类,然后派生 出很多其它的类型:长方形,椭圆形,圆形以及其它.你可以在任何地方用图形 状来取代圆形,这就是多态的等代类型.这是正确的,因为圆形就是一个特殊的 形状.当你创建一个类时,明确的类型转化是可以自动完成的.正如.Net中类的 继承,因为System.Object是所有类型的基

Effective C#原则27:避免使用ICloneable

ICloneable看上去是个不错的主意:为一个类型实现ICloneable接口后就可 以支持拷贝了.如果你不想支持拷贝,就不要实现它. 但你的对象并不 是在一个"真空"的环境中运行,但考虑到对派生类的些影响,最好 还是对ICloneable支持.一但某个类型支持ICloneable, 那么所有的派生类都必 须保持一致,也就是所有的成员必须支持ICloneable接口或者提供一种机制支持 拷贝.最后,支持深拷贝的对象,在创建设计时如果包含有网络结构的对象,会 使拷贝很成问题.IClon

Effective C#原则26:用IComparable和IComparer实现对象的顺序关系

你的类型应该有一个顺序关系,以便在集合中描述它们如何存储以及排 序..Net框架为你提供了两个接口来描述对象的顺序关系:IComparable 和 IComparer.IComparable 为你的类定义了自然顺序,而实现IComparer接口的类 可以描述其它可选的顺序.你可以在实现接口时,定义并实现你自己关系操作符 (<,>,<=,>=),用于避免在运行时默认比较关系的低效问题.这 一原则将讨论如何实现顺序关系,以便.Net框架的核心可以通过你定义的接口对 你的类型进行排序.这