Saturday, December 29, 2012

C# note

C#泛型能力由CLR在运行时支持,它既不同于C++在编译时所支持的静态模板,也不同于Java在编译器层面使用“擦拭法”所支持的简单泛型

C#中还提供了一种数据类型“委托(Delegate)”,它可以被视为是一种类型安全的函数指针。一个委托也是一个对象,它明确定义了函数的签名,可以用来保存一个包含了调用时所需的上下文的函数。在.NET程序中,一个回调函数往往会使用委托进行表示,而在Java中,则一般会使用接口。
C#的装箱和拆箱是.NET平台已有的功能,C#编译器只要直接使用即可,而Java的自动装箱和拆箱完全是编译器的工作。
Java中先将Object对象转化成Integer类型,然后再隐式地转化至int基本类型。而在C#中,int类型是直接和Object类型相互转化的。
Java泛型由于在运行时去除所有泛型的类型信息,因此这种泛型实现方式叫做Type Erasure(类型擦除)。
Type Erasure造成的限制还有不少,如果您是一个C#程序员,可能难以相信以下的Java代码都是不合法的:

public class MyClass<E> {
   public static void myMethod(Object item) {
       if (item instanceof E) { // Compiler error
           ...
       }
       E item2 = new E(); // Compiler error
       E[] iArray = new E[10]; // Compiler error
   }
}

说起C#的Attribute与Java的Annotation,两者最大的区别便是:C#中的Attribute是类,而Java中的Annotation是接口。
在于Java的Annotation只能定义为失血的对象,而C#的Attribute可以在需要的时候包含一定的逻辑,这样便可以让C#程序员获得更好的灵活性,使用更丰富的开发模式。
C#中的Attribute也有缺点,例如无法使用泛型

No comments:

Post a Comment