C#学习记录(25)转换

到目前为止,在需要把一种类型转换为另一种类型时,使用的都是类型转换。比如显式转换和隐式转换。

    在计算过程中,int 可以隐式转换为long 或double,采用相同的方式还可以定义所创建的类(隐式或显式)转换为其他类的方式。

    一.重载转换运算符

    除了重载如上所述的数学运算符之外,还可以定义类型之间的隐式和显式转换。


     ConvClass1 op1 = new ConvClass1();

    ConvClass2 op2 = op1;       ///隐式转换

    ConvClass2 op2 = (ConvClass2)op1;    ///显式转换

    

    二.as运算符

    <operand> as <type>

    这个运算符只适用于下列情况:
     <operand>的类型是<type>类型
     <operand>可以隐式转换为<type>类型

     <operand>可以封箱到<type>类型中

     注意:   如果不能从<operand>转换为<type>,则表达式的结果就是null。

    class ClassA : IMyInterface
    {
    }
    class ClassD : ClassA    ///ClassD类型的变量包含ClassA 类型的实例,D可以转换成A
    {

    }

    ClassA obj1 = new ClassA();

    ClassD obj2 = obj1 as ClassD;    //把obj1 中存储的ClassA 转换为ClassD 类型

    因为ClassA不能转换为ClassD,所以转换失败,也就是obj2的结果是null。    

    ClassD obj1 = new ClassD();
    ClassA obj2 = obj1;
    ClassD obj3 = obj2 as ClassD;

    这次obj3 最后包含与obj1 相同的对象引用,而不是null。

    (1)简单的类型转换代码会抛出异常

    ClassA obj1 = new ClassA();

    ClassD obj2 = (ClassD)obj1;

    而用as运算符则会把null 值赋予obj2,而不是异常导致程序出错。

    

    (2)实例:Animal 和派生于Animal 的一个类Cow中,

    public void MilkCow(Animal myAnimal)
    {
        Cow myCow = myAnimal as Cow ; 
        if (myCow != null)     ///如果对象不为空,
        {
            myCow.Milk() ; 
        }
        else
        {
            Console.WriteLine ("{0} isn’t a cow, and so can’t be milked.", myAnimal.Name) ;
        }

    }

    这要比检查异常要简单得多!

猜你喜欢

转载自blog.csdn.net/shenseyoulan/article/details/80898467