C#中在构造函数中访问虚成员有什么问题?


本文摘自PHP中文网,作者零下一度,侵删。

如果在一个类中定义了虚属性或者虚方法,又在构造函数中访问了这个虚属性或方法,此时VisualStudio是不会给出警告,并且编译也没有问题,但是如果安装了Resharper插件则会给出警告提示:“在构造函数中访问了虚成员”,那么,这为何是一个安全隐患,下面给出一个例子说明:

using System;

namespace VirtualDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            var test = new SubClass();
            Console.ReadKey();
        }
    }

    class BaseClass
    {
        protected virtual string VirtualProperty { get; set; }

        public BaseClass()
        {
            var p = VirtualProperty;
            VirtualMethod();
        }

        protected virtual void VirtualMethod()
        {

        }
    }

    class SubClass : BaseClass
    {
        private MockClass _mockClass;

        public SubClass()
        {
            _mockClass = new MockClass();
        }

        protected override string VirtualProperty
        {
            get { return _mockClass.MockProperty; }
            set { _mockClass.MockProperty = value; }
        }

        protected override void VirtualMethod()
        {
            var p = _mockClass.MockProperty;
        }
    }

    class MockClass
    {
        public string MockProperty { get; set; }
    }
}

该示例很简单,在构造SubClass时出现了空引用报错,因为基类构造函数先于子类构造函数运行,而子类构造函数中初始化了一个成员类,但是基类构造函数访问虚成员时子类还没构造,所以出现了空引用报错。有多种方式可以避免这一情况,可以通过子类字段初始化的方式来构造成员类,这个语法糖可避免构造函数的时序问题,第二个是可定义一个虚的Initialize方法在子类构造函数第一步调用,子类在继承这个方法时初始化需要的依赖。

以上就是C#中在构造函数中访问虚成员有什么问题?的详细内容!

Unity3D游戏开发实战教程打砖块游戏
教程

Unity3D游戏开发实战教程打砖块游戏

大漠老师

您将获得:掌握某些知识点、学会某些技巧(或思路)。大漠老师热衷游戏开发,技术分享,先后任职于光宇游戏、联众游戏等知名网络游戏软件公司,具有丰富的实战经验。


Unity3D游戏RollABall项目实战视频教程
教程

Unity3D游戏RollABall项目实战视频教程

大漠老师

您将获得:掌握某些知识点、学会某些技巧(或思路)。大漠老师热衷游戏开发,技术分享,先后任职于光宇游戏、联众游戏等知名网络游戏软件公司,具有丰富的实战经验。



Unity3D游戏实战换装系统视频教程
教程

Unity3D游戏实战换装系统视频教程

大漠老师

您将获得:掌握某些知识点、学会某些技巧(或思路)。讲师:大漠老师;热衷游戏开发,技术分享,先后任职于光宇游戏、联众游戏等知名网络游戏软件公司,具有丰富的实战经验。


C#上位机串口编程、Modbus编程
教程

C#上位机串口编程、Modbus编程

黄老师编程课堂

您将获得:1、熟练掌握Winform框架串口编程;2、掌握Modbus协议报文格式;3、掌握 C# Modbus协议编程;4、Modbus RTU、ASCII、TCP。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在


评论

管理员已关闭评论功能...