您的位置:首页 > 编程学习 > C# > 正文

C#中is 运算符与as运算符的区别和作用

更多 时间:2013-8-22 类别:编程学习 浏览量:1618

C#中is 运算符与as运算符的区别和作用

C#中is 运算符与as运算符的区别和作用

Is:检查对象是否与给定的类型兼容。例如,下面的代码可以确定MyObject类型的一个实例,或者对象是否从MyObject派生的一个类型:

如果所提供的表达式非空,并且所提供的对象可以强制转换为所提供的类型而不会导致引发异常,则 is 表达式的计算结果将是 true。

如果已知表达式始终是true或始终是false,则is关键字将导致编译时警告,但是通常在运行时才计算类型兼容性。

注意:is运行符不能重载,is运行符只考虑引用转换、装箱转换和取消装箱转换。不考虑其它转换,如果用户定义转换。

在Is运算符的左侧不允许使用匿名方法。lambda表达式属于例外。

如果对象引用是null,is运算符总是返回false,因为没有可检查其类型的对象。

is运算符实例:

  •  
  • C# 代码   复制
  • 
      Object myObject = new Object();
    Boolean b1 = (myObject is Object); //b1=true.  
    Boolean b2 = (myObject is Employee);    //b2=false.   
    
    
    //is运算符通常像下面这样使用:
    
    if (myObject is Employee) 
    {
        Employee myEmployee = (Employee)myObject;
    }
    				
  • as:用于检查在兼容的引用类型之间执行某些类型的转换。

    实例:

  •  
  • C# 代码   复制
  • 
    Employee myEmployee = myObject as Employee;
    if (myEmployee != null){ }
    
    Object o = new Object();        //新建一个Object对象
    Employee e = o as Employee;     //将o转型为一个Employee  
    //上述转型操作会失败,不会抛出异常,但e会被设为null
    e.ToString();   //访问e会抛出一个NullReferenceException
    			

     

  • 在上面这段代码中,CLR核实myObject是否兼容于Employee类型;如果是,as会返回对同一个对象的一个非null的引用。如果myObject不兼容于Employee类型,as运算符会返回null。

    注意:as运算符造成CLR只校验一次对象的类型。if语句只是检查myEmployee是否为null。这个检查的速度比校验对象的类型快得多。

    as运算符的工作方式与强制类型转换一样,只是它永远不会抛出一个异常。相反,如果对象不能转换,结果就是null。所以,正确的做法是检查最终生成的一引用是否为null。如果企图直接使用最终生成的引用,会抛出一个System.NullReferenceException异常。

    as运算符类似于强制转换操作。但是无法进行转换,则as返回null而非引发异常。

    注意:as运算符只执行引用转换和装箱转换。as运算符无法执行其它转换,如果用户定义的转换,这类转换应使用强制转换表达式来执行。

     

    标签:C# 运算符 is as