对象的类型转换
用户定义的转换
1、As和Is关键字类型转换
由于对象是多态的,因此基类类型的变量可以保存派生类型。 若要访问派生类型的方法,需要将值强制转换回该派生类型。 不过,在这些情况下,如果只尝试进行简单的强制转换,会导致引发 InvalidCastException 的风险。 这就是 C# 提供 is 和 as 运算符的原因。
- typeA is type B 仅判断
- typeA as TypeB 先判断,再转换
如果成功了那就是真的成功了,如果不成功返回空
//as 也是转换,但是 如果转换不了的 不报异常,返回来的是null
// is 转换 ,返回的是bool值,true就是能转换,false 就是不能转换
As 和强制类型转换的区别:
1、As转换失败返回null,强制类型则抛出异常。
2、As只能用于引用类型不能用于值类型,可通过判断类型是否为null(值类型不能为null)。在转换之前先用is判断一下。
3、最大的区别在于如何处理用户自定义的转换。As和is都会判断转换之后类型是否可完成(转换之后是否是目标类型,转换的对象是不是派生类等问题),强制类型则会使用转换操作符直接进行转换,包括任何内建的值的数值转换(如:long->int)
优先考虑使用as进行转换,再考虑使用is,最后考虑使用强制类型转换。
2、转换后类的成员变化
如下图,这是一种隐式转化:
这里有几个需要主要的问题:
new 和override关键字不同
1 class ClassA 2 { 3 public virtual void SayHello_new() 4 { 5 Console.WriteLine("I am ClassA"); 6 } 7 public virtual void SayHello_override() 8 { 9 Console.WriteLine("I am ClassA"); 10 } 11 } 12 13 class ClassB:ClassA 14 { 15 public new void SayHello_new() 16 { 17 Console.WriteLine("I am ClassB"); 18 } 19 public override void SayHello_override() 20 { 21 Console.WriteLine("I am ClassB"); 22 } 23 } 24 class Program 25 { 26 static void Main(string[] args) 27 { 28 ClassA myclass = new ClassB(); 29 myclass.SayHello_new();//classB使用覆盖方法 30 myclass.SayHello_override();//classB中使用重写方法 31 } 32 }
在转换后会发现:
子类中override会重写父类virtual成员!子类中new无法覆盖父类virtual成员。但是父类中的其他成员不会变。