自动属性初始化IL指令顺序

Yus*_*dın 4 c# cil properties fody

我想在auto属性上设置默认值,用Fody做一些IL编织.

据我所知,初始化只是一个语法糖,它在构造函数中设置了支持字段.所以我认为默认值是使用从最后一个属性的初始化结束到stfld设置当前属性的支持字段的指令的指令创建的.

但是,这假设初始化始终是构造函数中的第一件事.这是正确的假设吗?是否有任何边缘情况需要考虑,例如优化?

Yus*_*dın 5

我发现这个pdf文件标题为C#中的Upcoming Features,它描述了C#6的新语言功能.

这是关于auto属性初始化器的部分(Emphasis is mine):

初始化程序直接初始化后备字段; 它不能通过autoproperty的setter工作.

初始化器按照写入的顺序执行,就像 - 和 - 字段初始化器一样.

就像字段初始值设定项一样,自动属性初始值设定项不能引用"this" - 毕竟它们是在对象正确初始化之前执行的.这意味着没有很多有趣的选择来初始化自动属性.但是,主要构造函数改变了这一点.Autoproperty初始化器和主要构造器因此相互增强.

由于字段初始值设定项和自动属性初始值设定项被同等对待,因此C#规范的以下部分也应适用于自动属性初始化.

10.11.3构造函数执行

变量初始值设定项转换为赋值语句,这些赋值语句在调用基类实例构造函数之前执行.此排序可确保在执行有权访问该实例的任何语句之前,所有实例字段均由其变量初始值设定项初始化.

...

将实例变量初始值设定项和构造函数初始值设定项视为在构造函数体之前自动插入的语句很有用.