• 我不知道的C#构造方法中调用虚方法


    class Program
     {
      static void Main(string[] args)
      {
       try
       { B b = new B();  }
       catch(Exception ex)
       {Console.WriteLine(ex.GetType().ToString()); }
       Console.Read();
      }

      class A
      { protected Ref my;
       public A()
       { my = new Ref();
        Console.Write(ToString()); }
       public override string ToString()
       {  return my.ToString(); }
      }

      class B : A
      { private Ref my2;
       public B() : base()
       { my2 = new Ref();}
       public override string ToString()
       {return my2.ToString();}
      }
      //一个对象引用
      class Ref
      { public string s = "我是一个对象";}
     }
        运行以上代码会出现异常,原因很简单,类A是其他类的基础类,但是在类A的构造函数中调用了虚方法ToString(),导致程序出错。原因是在执行new B();  时的执行顺序是首先初始化自己的保护变量my然后调用基类的构造函数A(),最后再执行自己的构造函数B(),问题处在调用基类构造函数A()的时候整个对象类型任然保持了真是的类型B,CLR执行类型A的虚方法ToString()的时候会去找它自身的虚方法,就是类型B的ToString()方法,但是此时B的构造过程还没有结束它是不可能调用到这个ToString()虚方法的,对于未构造成员的访问将会产生异常。
         避免这种异常的方法是在将会被集成的类的构造函数中永远不要使用虚方法。

    作者:Tyler Ning
    出处:http://www.cnblogs.com/tylerdonet/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,请微信联系冬天里的一把火

  • 相关阅读:
    Python 文件操作
    Python 操作 sqlite
    Python中的random模块
    Linux系统下的/etc/nsswitch.conf文件
    Python 列表/元组/字典总结
    快斗之翼:python2的print和python3的print()
    田小计划:图解Python深拷贝和浅拷贝
    Python 自省指南
    Python运算符优先级
    tc: 模拟网络异常的工具
  • 原文地址:https://www.cnblogs.com/tylerdonet/p/1553259.html
Copyright © 2020-2023  润新知