在 C# 中,目前没有自动生成的属性(尽管 VB.NET 自动属性可以做到这一点)。这是我经常为自己所希望的。所以你可以手动滚动你自己的属性,或者使用构造函数。
无论哪种方式,您都会有一些您希望不必编写的代码来执行此操作(没有构造函数的手动属性与具有构造函数的自动属性)。
不过,有趣的是,这两个选项之间的 IL 是不同的。当您有一个带有使用初始化器的支持字段的手动属性时,它将在 C# 中的基类构造函数之前执行:
MyClass..ctor:
IL_0000: ldarg.0
IL_0001: newobj System.Collections.Generic.List<System.Object>..ctor
IL_0006: stfld UserQuery+MyClass._products
IL_000B: ldarg.0
IL_000C: call System.Object..ctor
IL_0011: nop
IL_0012: ret
在构造函数中使用带有初始化的自动属性时,将在 C# 中的基类构造函数之后执行:
MyClass..ctor:
IL_0000: ldarg.0
IL_0001: call System.Object..ctor
IL_0006: nop
IL_0007: nop
IL_0008: ldarg.0
IL_0009: newobj System.Collections.Generic.List<System.Object>..ctor
IL_000E: call UserQuery+MyClass.set_Products
IL_0013: nop
IL_0014: nop
IL_0015: ret
我只是出于好奇而这么说,因为在 .NET 中编写依赖于初始化顺序的代码可能是有风险的(初始化顺序实际上在 VB.NET 和 C# 之间有所不同)