对象的类型转换

用户定义的转换


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成员。但是父类中的其他成员不会变。

 

posted @ 2017-07-31 11:40  20世纪少年  阅读(483)  评论(0编辑  收藏  举报