c# is & as

1:is 是判断类型,用于检查对象是否与给定类型兼容,不成功则不会抛出异常,如果兼容则返回true,如果不兼容则返回false。在进行类型转换之前用

做为C#里的类型转换操作符,is和as都是强制类型转换。

f (P_obj is System.String)  
 {  
     string objStr = (string)P_obj;  
     MessageBox.Show("与类型兼容", "提示!");  
 }  
 else  
     MessageBox.Show("与类型不兼容", "提示!");

Difference

  • is 类型检查,检查一个对象是否兼容于制定类型,并且返回一个布尔值。如果对象引用是null,is操作符总是返回false,因为没有可检查的其类型的对象。is操作符永远不会抛出异常
  • as 安全的显示类型转换,仅支持引用类型不支持值类型。永远不会抛出异常,如果转换失败返回null。简化代码,提升性能。

在上面的例子中进行两次兼容性检查,一在判断时P_obj is System.String,另一次在转换(string)P_obj时。用as只需要 一次,永远不会抛出异常。

Example

ClassA{
  ...
}
//is 操作符使用:

Object obj = new Object(); 
Boolean b = obj is ClassA; 

if(b)
{
    ClassA a = (ClassA) obj;
    ... 
}

在上诉代码中,CLR(Common Language Runtime)实际会检查两次对象类型。is操作符首先核实obj是否兼容于ClassA 类型。如果是,那么在if语句内部执行类型转换时,CLR再次核实obj是否引用一个ClassA。CLR的类型检查增强了安全性,但也会对性能造成一定的影响。这是因为CLR首先必须判断(obj)引用的对象的实际类型。然后CLR必须遍历继承层次结构,用每个基类型去核对指定的类型(ClassA)。

//as 操作符使用:
Object obj=new Object(); 
ClassA a= obj as ClassA;

if(a!=null) 
{
  ...
}

在上诉代码中,CLR核实obj是否兼容于ClassA类型,如果是,as会返回对同一个对象的一个非null引用。如果obj不兼容ClassA类型,as操作符会返回null。

因此,as操作符使CLR只检验一次对象的类型。
if语句只是检查a是否为null。这个检查的速度比检验对象的类型快得多。所以正确做法是检查最终生成的引用是否为null。如果企图直接使用最终生成null的引用,会抛出一个 NullReferenceException异常。

本文由金沙官网线上发布于编程,转载请注明出处:c# is & as

您可能还会对下面的文章感兴趣: