类型转换中as、is的使用

类型转换包括显示转换和隐式转换,在.NET中类型转换的基本规则如下:

  • 任何类型都可以安全的转换为其基类类型,可以由隐式转换来完成;
  • 任何类型转换为其派生类型时,必须进行显示转换,转换的规则是:(类型名)对象名;
  • 使用GetType可以取得任何对象的精确类型;
  • 基本类型可以使用Covert类实现类型转换;
  • 除了string以外的其他类型都有Parse方法,用于将字符串类型转换为对应的基本类型;
  • 值类型和引用类型的转换机制称为装箱(boxing)和拆箱(unboxing)。
is/as操作符,是C#中用于类型转换的,提供了对类型兼容性的判断,从而使得类型转换控制在安全的范畴,提供了灵活的类型转换控制。
is的规则如下:
  • 检查对象类型的兼容性,并返回结果,true或者false;
  • 不会抛出异常;
  • 如果对象为null,则返回值永远为false。
as的规则如下:
  • 检查对象类型的兼容性,并返回结果,如果不兼容就返回null;
  • 不会抛出异常;
  • 如果结果判断为空,则强制执行类型转换将抛出NullReferenceException异常。

as -----------运算符用于在兼容的引用类型之间执行某些类型的转换 。 例如:

object[] obj = new object[3];

obj[0] = new class1();   

obj[1] = "hello";    

obj[2] = 10;     

for (int i = 0; i < obj.Length; i++)    

{        

     string s = obj[i] as string;

}

if (s != null)      

  {          

      Console.WriteLine(s); 

 }      

  else       

{           

     Console.WriteLine("not a string");    

}    

      Console.ReadLine(); }

输出结果:

not a string

hello

not a string


class Base

{    

public override string ToString()    

    {        

        return "Base";    

    } 

}

class Derived : Base

{

}

class Program

{

     static void Main()

     {

          Derived  d = new Derived();

          Base b = d as Base;

        if (b != null)

         {

             Console.WriteLine(b.ToString());       
         }

}

对于继承类,允许把子类转换成父类,但是不可以把父类转换成子类,不同类之间,值类型不可转换

is  --------------- 检查对象是否与给定类型兼容。

例如,下面的代码可以确定对象是否为 MyObject 类型的一个实例,或者对象是否为从 MyObject 派生的一个类型

if (obj is MyObject)

{

}

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

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

3、不能重载 is 运算符。

4、请注意,is 运算符只考虑引用转换、装箱转换和取消装箱转换。不考虑其他转换,如用户定义的转换。

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

class MyQuickSort

{

     static void Main(string[] args)

     {

         class2 c2 = new class2();

          if (c2 is class1)

         {

             Console.WriteLine("Yes");

         }

        else

         {

            Console.WriteLine("No");

        }

         Console.ReadLine();
    }

}

class class1

{

     public override string ToString()

     {

         return "";

     }

}

class class2:class1 {  } 
输出结果:

YES


is/as操作符,提供了更加灵活的类型转型方式,但是as操作符在执行效率上更胜一筹,我们在实际的编程中应该体会其异同,酌情量才。


你可能感兴趣的:(编程,.net,String,C#,null)