WEB开发网
开发学院软件开发C语言 C# 特性之泛型 阅读

C# 特性之泛型

 2010-09-30 22:35:56 来源:WEB开发网   
核心提示: 这里如果能这样使用我们认为应该是安全的:IOperation<IData>opr=newAdd();opr.Run(data1);opr=newComplexAdd();opr.Run(data2);然而这样的代码是无法通过编译的,尽管我们知道它们的使用绝对安全的,C# 特性之泛型(

这里如果能这样使用我们认为应该是安全的:

IOperation<IData> opr = new Add();
opr.Run(data1);
opr = new ComplexAdd();
opr.Run(data2);

然而这样的代码是无法通过编译的,尽管我们知道它们的使用绝对安全的,因为AddData或ComplexData是IData的子类。幸运的是,在.Net4.0中程序员将不会有这个烦恼了。

3. 泛型不支持操作符。在C++中模板支持操作符,然而,由于操作符是静态的并且是编译时决定的(参看这篇文章),因此作为运行时的泛型无法实现类型间的该项操作,虽然你可以通过接口来达到同样功能,但方便的操作符终究无法在泛型中得到支持。这可以算是C#泛型的一个缺点,因为在很多时候它确实很有用。

4. 泛型的类型转换问题。泛型无法从其他类型(object除外)直接强制转换,这个时候如果需要将其他类型转换为泛型对象时有两种方式,一种是该泛型约束是 class或基类,这时候可以通过as 操作符来转换,如 return somevalue as T。但是有时候如果我们不知道该泛型的类型或者该泛型类型是struct该如何转换呢?答案是通过两次类型转换,首先我们把待转换对象转换为object 对象,然后直接对该object对象强制转换为T,e.g. return (T)(object)someVar。具体例子你可以参考这篇文章。

最后,在泛型中有个关键字--default,顾名思义,它是在引用类型和值类型没有初始化的时候提供默认值的。对引用类型默认值是null,值类型则是0.

泛型约束

如果.Net仅仅出现泛型而没有泛型约束,我想泛型的功能一定会大打折扣的,正是有了泛型约束,才让我们在操作这些类型更加规范和准确。这也是同为强类型的C#比C++的模板更安全的一点。

上一页  1 2 3 4 5  下一页

Tags:特性

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接