zoukankan      html  css  js  c++  java
  • 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异常了。

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

  • 相关阅读:
    网络之传输层
    局域网的物理组成
    网络基础
    RAID磁盘阵列
    mount挂载和交换分区swap
    Linux文件系统
    sed命令基础2
    sed命令基础
    LVM基础
    磁盘配额基础
  • 原文地址:https://www.cnblogs.com/jmax/p/3181323.html
Copyright © 2011-2022 走看看