IS 和AS

http://www.cnblogs.com/haiyang1985/archive/2009/03/12/1410023.html

1一. as 运算符用于在兼容的引用类型之间执行某些类型的转换。

static void Main(string[] args)
{
    object[] obj = new object[3];
    obj[0] = 10;
    Type t = obj[0].GetType();
    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());
        }
    }
}

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

安全性:

as操作符不会做过的转换操作,当需要转化对象的类型属于转换目标类型或者转换目标类型的派生类型时,那么此转换操作才能成功,而且并不产生新的对象【当不成功的时候,会返回null】。因此用as进行类型转换是安全的。

效率:

当用as操作符进行类型转换的时候,首先判断当前对象的类型,当类型满足要求后才进行转换,而传统的类型转换方式,是用当前对象直接去转换,而且为了保护转换成功,要加上try-catch,所以,相对来说,as效率高点。
需要注意的是,不管是传统的还是as操作符进行类型转换之后,在使用之前,需要进行判断转换是否成功,如下:

if( newValue! = null)
{
    //Work with the object named “newValue“
}

http://www.cnblogs.com/cgli/archive/2011/05/10/2041731.html

is检查一个对象是否兼容于指定的类型,并返回一个Boolean值:true或者fasle。注意,is操作符永远不会抛出异常,请看以下示例:

ClassA
{
.... } Object o
= new Object(); Boolean b1 = (o is Object); //b1为true. Boolean b2 = (o is ClassA); b2为false. 如果对象引用是null, is操作符总是返回false, 因为没有可检查的其类型的对象。 is 操作符通常像下面这样使用: if(obj is ClassA) { ClassA a = (ClassA) obj;... }

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

原文地址:https://www.cnblogs.com/ZkbFighting/p/7601020.html