zoukankan      html  css  js  c++  java
  • 编写高质量代码改善C#程序的157个建议——建议95:避免在构造方法中调用虚成员

    建议95:避免在构造方法中调用虚成员

    在构造方法中调用虚方法会带来一些意想不到的错误,虽然这种方法不常见,但还是需要注意这类陷阱。

            static void Main()
            {
                American american = new American();
                Console.ReadKey();
            }
    
            class Person
            {
                public Person()
                {
                    InitSkin();
                }
    
                protected virtual void InitSkin()
                {
                    //省略
                }
            }
    
            class American : Person
            {
                Race Race;
    
                public American()
                    : base()
                {
                    Race = new Race() { Name = "White" };
                }
    
                protected override void InitSkin()
                {
                    Console.WriteLine(Race.Name);
                }
            }
    
            class Race
            {
                public string Name { get; set; }
            }

    运行会出现异常NullReferenceException:未将对象引用设置到对象的实例。

    在调用者代码中,我们需要创建一个American的实例对象american。由于发现实例还存在一个积累Person,所以运行时会首先调用基类的构造方法。在构造方法中Person调用了虚方法InitSkin。由于是虚方法,所以会在运行时调用子类的InitSkin方法。子类的InitSkin方法中,需要打印出名字。而这个时候,方法的调用堆栈还一直在基类的构造方法内,也就是在子类的构造方法中的代码还完全没有执行:

    Race = new Race() { Name = "White" };

    所以会抛出异常。

    基于以上原因,建议不要在构造方法中调用虚成员。

    转自:《编写高质量代码改善C#程序的157个建议》陆敏技

  • 相关阅读:
    Javascript中的this之我见
    Javascript中call、apply之我见
    IE 11中 onpropertychange失效
    解决在.NET 4.0下无法发送包含尖括号等请求的问题
    连续赋值与求值顺序var a = {n:1};a.x = a = {n:2}; alert(a.x);
    DBCC维护语句语法
    SqlServer数据库碎片整理——BCC SHOWCONTIG
    Change Jenkins time zone
    Jenkins中执行docker命令报错
    Redis 慢查询
  • 原文地址:https://www.cnblogs.com/jesselzj/p/4745264.html
Copyright © 2011-2022 走看看