首页 > 代码库 > 第一章 C# is和as

第一章 C# is和as

一、明确两个基本概念

     隐式转换:

      a、对于值类型,低精度=>高精度。eg:int=>long

      b、对于引用类型,子类向祖宗类转换过程。eg:对象=>Object

     显式转换:显示转换是隐式转换的逆过程。

     对于c#,与类型转换相关的其他术语,就不在此处提及,如:

  • 拆箱与装箱
  • GetType获取对象类型( System.Object.ReferenceEquals(Object obj1,Object obj2))
  • 基本类型:Convert类;
  • Parse();
  • ToString();

二、为什么要用is和As

     在类型转换时,对于事先并不知对象的具体类型时,为了避免转换失败造成系统崩溃问题,我们一般在容易出现问题或者有可能出现问题(当时并不能确定是否会发生异常)的地方,用try......catch.....finally....来规避程序崩溃等问题,当然这样做也方便测试,这就是is和as的功能之一,除此之外,对系统进行性能优化时,能不用try....catch....就尽量不用,is和as满足这一原则。

三、示例

  1、is用法

      定义:判断某个对象是否兼容另一个对象。永远不会抛出异常。

      返回值:布尔值。若兼容,则返回true;若不兼容,则为false;若对象为空null,则为false;

例1:兼容
Label lbl = new Label();
if (lbl is Object)
{
Object objLbl = (Object)lbl;
Response.Write("true");
}
else
{
Response.Write("false");
}

测试结果为:true

  

例2:不兼容
Label lbl = new Label();
if (lbl is TextBox)
   {
       Response.Write("true");
    }
else
    {
        Response.Write("false");
     }
测试结果为:false

  

例3:对象为NULL
Label lbl = null;
if (lbl is Object)
  {
      Response.Write("true");
  }
else
  {
      Response.Write("false");
   }
测试结果:false

  

 is一般结构:

if (A is B)//第一次兼容检查
    {
       B  b=(B)A;//第二次兼容检查
    }A

分析:对于is,CLR会进行2次兼容性检查,第一次判断A is B,若为真,则再次进行兼容检查B b=(B)A;

   

 

2、as用法 

      定义:判断某个对象是否兼容另一个对象。永远不会抛出异常。

      返回值:若兼容,则返回结果;若不兼容,则返回null;若为空,则返回null。

 

 例1:兼容
Label lbl1 = new Label(); Label lbl2 =lbl1 as Label; Response.Write(lbl2);//System.Web.UI.WebControls.Label

  

 例2:不兼容
string str = "AS转换"; Label lbl = str as Label;//显示编译错误 Response.Write(lbl);

  

例3:对象为Null
 Object obj = null;
 Label lbl = obj as Label;
 Response.Write(lbl);//null

  

四、比较

      由于CLR对is会进行两次检查,对as只进行一次检查,故as效率要高一些,一般情况下,使用as而不使用is.

      参考网址:     http://developer.51cto.com/art/200908/145432.htm;http://developer.51cto.com/art/200908/145432.htm

    

 

第一章 C# is和as