• C# 构造函数中调用虚方法的问题


    请看下面代码:

    using System;
    
    public class A{
        public A(){
            M1();
        }
    
        public virtual void M1(){}
    }
    
    public class B : A{
        private string _method;
        
        public B(){
            _method = "B_C";
        }
        
        public override void M1(){
            Console.WriteLine("Type:{0}, in B, {1}",GetType(), _method.ToUpper());
        }
    }
    
    public class VirtualDemo{
        public static void Main(string[] args){
            var b = new B();
        }
    }

     也许有些意外,程序报了个NullReferenceException异常。

    问题在于,实例化B时,首先调用B的基类A的构造函数再调用B的构造函数。但是在A的构造函数中调用了一个虚方法(Virtual),这时不管A是否实现了虚方法M1,都将调用B的重写方法M1, 但些时B中的私有变量 _method 还没设置值,还是null, 所以调用 _method.ToUpper()时报NullReferenceException异常了。

    所以尽量不要在基类构造函数中调用虚方法。

  • 相关阅读:
    Chap5:操作文件和目录[The Linux Command Line]
    ABC3
    ABC2
    ABC
    Spring MVC / Boot
    Usefull Resources
    [ Learning ] Design Pattens
    [ Learning ] Spring Resources
    URL Resources
    [ Windows BAT Script ] BAT 脚本获取windows权限
  • 原文地址:https://www.cnblogs.com/jmax/p/3181323.html
Copyright © 2020-2023  润新知