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

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

如果在一个类中定义了虚属性或者虚方法,又在构造函数访问了这个虚属性或方法,此时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#中在构造函数中访问虚成员有什么问题?的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2439994.html

(0)
上一篇 2025年3月3日 12:17:17
下一篇 2025年3月3日 12:17:34

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论