• 对象的类型转换


    用户定义的转换


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

  • 相关阅读:
    Linq to Sql学习总结1
    SQL相关
    C#各种小知识点总结
    Ext.Net学习笔记
    ASP.NET MVC3入门学习总结
    leetcode-剑指67-OK
    leetcode-剑指44-OK
    leetcode-剑指51-OK
    leetcode-剑指32-III-OK
    leetcode-剑指49-OK
  • 原文地址:https://www.cnblogs.com/craft0625/p/7256907.html
Copyright © 2020-2023  润新知