您的位置:首页 > 其它

由最近值类型和引用类型探讨想到的一些问题

2010-12-13 09:57 162 查看
一、说在前面

前几天园子里一篇《有多少人能分的清值类型和引用类型》的文章,引起了大家的广泛讨论。后续文章包括《标准答案-有多少人能分的清值类型和引用类型》《.Net类型之辩》,都讲的很好,我想我们缺少的就是这种存技术的探讨,如果您说别人说错了,你拿出证据,我想大多数人都能虚心接受并改正。而不是永无止境的口水仗,不但会给初学者带来困惑,而且会破坏技术氛围。我主观认为对于大多数人来说,搞清楚值类型和引用类型的目的,无非是在程序开发的时候,尽量避免由于对.Net的类型系统不了解所带来的问题。

二、类型转换

关于类型转换,翻开任何一本程序设计的书籍都会有相关的描述。在这里就不在赘述。我们在设计程序时,应该尽量避免使用类型转换(比如利用泛型技术避免类型转换),因为会造成如下问题

1.会因为没有记住使用的类型而出错,造成类型不兼容;
2.值类型和引用类型的相互转换即装箱拆箱使系统性能下降。

三、在.Net中如何利用is as进行类型转换

1、直接强制转换。例如Employee e = (Employee)o;但是这么转换如果o不是Employee类型则会抛出异常。

2、第二种是使用 as 或则 is 操作符进行转换。在《CLR via C# 》中有如下描述。

is检查一个对象是否兼容于指定的类型。并返回一个Boolean值:true or false。并且is操作符永远不会抛出异常,如果对象引用为null,is操作符总是返回false,因为没有可检查其类型的对象。

is 操作符通常像下面这样使用 if(o is Employee){Employee e = (Employee)o;} 在这段代码中,CLR实际会检查两次对象的类型。is 操作符首先会核实o是否兼容于Employee类型,如果是,那么在if语句执行内部转换时,CLR再次核实o是否引用一个Employee。CLR的类型检查增强了安全性,但无疑也对性能造成了一定的影响。这是因为CLR首先须判断变量(o)引用对象的实际类型。然后CLR必须遍历继承层次结构,用每个基类类型核对指定的类型(Employee)。由于这是一个相当常用的编程模式,所以C#为了提升性能,简化代码写法,提供了as操作符。
Employee e = o as Employee;if(e!=null){//在if语句中使用e}在这段代码中,CLR首先核实o是否兼容于Employee;如果是,as 将返回对同一个对象的非null引用。如果不兼容,as则会返回Null值。由于as操作符造成CLR只校验一次对象的类型。if语句只检查e是否为null.这个检查速度比校验类型快的多。as操作符的工作方式与强制类型转换一样,只是它永远不会抛出异常。

但是as 不能用于值类型而is却可以。例如如下代码将无法编译
object o = Factory.GetValue( );
int i = o as int;

关于as 和 is 在《你必须知道的.NET] 第一回:恩怨情仇:is和as 》中的介绍也很不错大家可以参考。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐