当is或as操作符遇到空引用null时的问题

我们都知道,在类型转换的时候推荐使用is 或 as操作符。这样不会因为强制类型转换失败而引发异常,但是,如果对一个空引用null进行操作,会怎样呢?

使用is 检查对象是否与给定类型兼容
  • 变量是null,则无论这个变量是不是我们要判断的类型,都会返回false:
  • 请注意,is 运算符只考虑引用转换、装箱转换和取消装箱转换。 不考虑其他转换,如用户定义的转换。
  • 在 is 运算符的左侧不允许使用匿名方法。 lambda 表达式属于例外


我们应该说p的类型不是Person吗?
这里只要想通一点应该就行了,p只是个引用, 而is操作应该是作用于引用的实例上的,null表示没有实例,既然没有实例,自然没法判断喽因此给了个false。
因此这里说p的类型,确切的应该是指p的实例的类型吧。
呵呵,听起来更像是文字游戏。

那么对于这种情况如何判断p,一个引用的类型呢?

类似的情况,使用as预算时,只要被转换的变量是null,都会返回null。


看看msdn上怎么说吧,

  • as运算符用于在兼容的引用类型之间执行某些类型的转换。
  • as 运算符类似于强制转换操作。 但是,如果无法进行转换,则 as 返回 null 而非引发异常。 
  • 注意,as 运算符只执行引用转换和装箱转换。
  •  as 运算符无法执行其他转换,如用户定义的转换,这类转换应使用强制转换表达式来执行。
至于这个是转换成功返回的值,还是转换失败的情况呢?
我觉得应该是失败的,就像is操作一样,毕竟引用为null,根本没有任何实例,又怎么转换呢?

又从网上很多人的blogs看到,as就是is的语法糖。
似乎是说  b = a as B ===> b =  (a is B)?  (B)a : null;
这样看来,as, is 是差不多是一回事嘛。。

再看看上面is的实例,我怎么才能知道这个引用p的类型呢?或者说这个引用 能接受什么样的实例呢? 求赐教啊
(ps: "用眼睛去看代码", 这个答案就算了。。。)

对于空引用null的is和as操作 还是相当蛋疼的事啊。哈哈!


作为菜鸟,我有个问题, is 和as 并不会引发空引用之类的异常,所以,对操作空引用得到的结果,会不会出现一些极端情况呢?(比如,由于没有考虑到操作数是null的情况,而得到不想要的结果,进一步导致一系列的错误)

是不是有必要在使用is 或 as之前先检查引用是否为null呢?这个也许需要根据具体程序分析评估吧




你可能感兴趣的:(C#,.Net)