您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

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

2024/6/29 16:22:53发布22次查看
如果在一个类中定义了虚属性或者虚方法,又在构造函数中访问了这个虚属性或方法,此时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#中在构造函数中访问虚成员有什么问题?的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product