C# 关键字:is,as

一、类型的转换

在c#中类型的转换分两种:显式和隐式,基本的规则如下:

  1.  基类对象转化为子类对象,必须显式转换,规则:(类型名) 对象。
  2.  值类型和引用类型的转换采用装箱(boxing)或拆箱(unboxing).
  3.  子类转化为基类对象。
  4.  基本类型互相之间转化可以用Covent类来实现。
  5.  字符串类型转换为对应的基本类型用Parse方法,除了String类型外其他的类型都可以用Parse方法。
  6.  用GetType可以取得对象的精确类型。
  7.  子类转化为基类,采用隐式转换。

二、关键字 is

检查一个对象是否兼容于其他指定的类型,并返回一个Bool值,如果一个对象是某个类型或是其父类型的话就返回为true,否则的话就会返回为false。永远不会抛出异常
如果对象引用为null,那么is操作符总是返回为false,因为没有对象可以检查其类型。

 1    object o = new object();
 2   if (o is Label)
 3   {
 4       Label lb = (Label)o;
 5       Response.Write("类型转换成功");
 6   }
 7   else
 8   {
 9       Response.Write("类型转换失败");   
10   } 

三、as的转换规则

  1.  检查对象类型的兼容性,并返回转换结果,如果不兼容则返回null;
  2.  不会抛出异常;
  3.  如果结果判断为空,则强制执行类型转换将抛出NullReferenceException异常;
  4.  用as来进行类型转换的时候,所要转换的对象类型必须是目标类型或者转换目标类型的派生类型
 1    object o = new object();    
 2   Label lb = o as Label;    
 3   if (lb == null)
 4   {
 5       Response.Write("类型转换失败");
 6   }
 7   else
 8   {      
 9       Response.Write("类型转换成功"); 
10   }

使用as操作符的限制

1、不用在类型之间进行类型转化,即如下编写就会出现编译错误。

Person p = new Person();
Person1 p1=p as Person1;

2、不能应用在值类型数据,即不能如下写(也会出现编译错误)。

object objTest = 11;
int nValue = objTest as int;

 

四、as与is的区别

  1.  as在转换的同时判断兼容性,如果无法进行转换,则 as 返回 null(没有产生新的对象)而不是引发异常。有了as我想以后就不要再用try-catch来做类型转换的判断了。因此as转换成功要判断是否为null。
  2.  as是引用类型类型的转换或者装箱转换,不能用与值类型的转换。如果是值类型只能结合is来强制转换
  3.  is只是做类型兼容判断,并不执行真正的类型转换。返回true或false,不会返回null,对象为null也会返回false。
  4.  as模式的效率要比is模式的高,因为借助is进行类型转换的话,需要执行两次类型兼容检查。而as只需要做一次类型兼容,一次null检查,null检查要比类型兼容检查快。

五、在进行类型转换的时候,可以按照如下的方式进行选择

1、Object => 已知引用类型
使用as操作符来完成

2、Object => 已知值类型
先使用is操作符来进行判断,再用类型强转方式进行转换

3、已知引用类型之间转换
首先需要相应类型提供转换函数,再用类型强转方式进行转换

4、已知值类型之间转换
最好使用系统提供的Convert类所涉及的静态方法

原文链接:https://www.jb51.net/article/56657.htm

猜你喜欢

转载自www.cnblogs.com/zhaoyl9/p/13196334.html