问题描述
|
这个问题已经在这里有了答案:
解决方法
我怀疑这是要防止您至少在基类构造函数运行之前使用该对象,以确保所有基类成员都已正确初始化。 (变量初始化器在基类构造函数之前执行,而构造函数主体在此之后执行。)
当我靠近它时,将检查带注释的规范是否对此有话要说...
编辑:C#4注释的规范没有任何解释。只是(在10.5.5.2中):
实例字段的变量初始化器无法引用正在创建的实例。
,字段初始化程序在基类构造函数之前运行,因此
this
尚不存在。它仅在基本构造函数完成执行后才存在。
17.10.2实例变量初始化器:
当实例构造函数没有
构造函数初始值设定项,或者具有
形式的构造方法初始值设定项
base(...),该构造函数隐式
执行指定的初始化
通过变量的初始化
在其类中声明的实例字段。
这对应于
执行的作业
进入后立即
构造函数和隐式函数之前
直接基类的调用
构造函数。变量
初始化程序在
它们出现的文字顺序
类声明。
,我相信这是因为字段在类初始化之前初始化,因此在运行以下代码时:
private Bar _bar = new Bar(this);
\“ this \”没有要引用的实际值。
虽然将其放在构造函数中意味着存在一个可由“ this \”引用的\“ Foo \”实例
,成员初始化程序在类构造函数之前运行。考虑到您可能在一个类中有许多成员初始化器。
如果在构造函数中使用\'this \'->所有带有初始化程序的成员都将被初始化。所以一切都很好。
如果在成员初始化程序中使用\'this \':其他成员(已附加初始化程序)可能尚未初始化-> \'this \'尚未准备好。这就是为什么在这里不允许使用\'this \'的原因。
,在C#中,没有逻辑要放在方法和属性的主体之外。
字段初始化程序是一个例外,但有一些限制。
使用该关键字获取当前对象的引用是错误的,因为类字段声明不是逻辑而是类设计,而这是运行时语义的一部分。
顺便说一句,这似乎是C#的设计决定,因为实际上,在类构造期间运行了字段初始化程序,因此“通过此类声明当前实例”应该可用。但是,这又超出了方法或属性主体范围?
正如Jon Skeet和其他人指出的那样,这是不可用的,因为字段初始化程序是在基本构造函数执行之后执行的。