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异常了。

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

posted on 2013-07-10 09:32  Maxwell Hu  阅读(705)  评论(0编辑  收藏  举报