自动生成属性中的Instanciate对象

有没有办法自动实例化对象而不在构造函数中实例化它?

实际上,我有类似的东西:

public List Products { get; set; } public MyClass() { this.Products = new List(); } 

但相反,我想直接实现我的列表而不在我的类的构造函数中指定类似的东西:

 public List Products = new List(); { get; set; } 

这有什么诀窍吗?

正如Jon Skeet所说:

不幸的是,现在没办法做到这一点。 您必须在构造函数中设置值。 (使用构造函数链接可以帮助避免重复。)

自动实现的属性现在很方便,但肯定会更好。 我发现自己不希望这种初始化像只读自动实现的属性一样,只能在构造函数中设置,并且只能由只读字段支持。 这些都可以在C#5中修复,我强烈希望这将解决不变性问题。 (我不认为他们中的任何一个都安排在C#4。)

来源: 初始化C#自动属性


如果需要在without using the constructor函数的without using the constructor初始化property ,则需要使用backing field

 class Demo { private List myProperty = new List(); public List MyProperty { get { return myProperty; } set { myProperty = value; } } } 

我想你是否可以给自动实现的属性赋予初始值。 这个问题的答案是“不”。

可以写一个手工财产:

 private List products = new List(); public List Products { get { return products; } set { this.products = value; } } 

你真的需要安装者吗? 您是否需要客户端能够将变量值替换为另一个列表? 您可能会发现只需要一个只读属性,在这种情况下您可以编写:

 private readonly List products = new List(); public IList Products { get { return products; } } 

请注意,在这里您仍然可以使用集合初始值设定项,例如

 Foo foo = new Foo { Products = { new Product("foo"), new Product("bar") } }; 

在C#中,目前没有自动生成的属性(尽管VB.NET自动属性可以执行此操作)。 这是我自己常常希望的。 因此,您可以手动滚动自己的属性,或使用构造函数。

无论哪种方式,你都会有一些代码,你希望你不必编写这样做(没有构造函数的手工属性与构造函数的auto-property)。

有趣的是,IL在两种选择之间是不同的。 当你有一个带有支持字段的手动属性使用初始化程序时,它将在C#中的基类构造函数之前执行:

 MyClass..ctor: IL_0000: ldarg.0 IL_0001: newobj System.Collections.Generic.List..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..ctor IL_000E: call UserQuery+MyClass.set_Products IL_0013: nop IL_0014: nop IL_0015: ret 

我只是说这是一个好奇点,因为在.NET中编写依赖于初始化顺序的代码会有风险(初始化顺序实际上在VB.NET和C#之间略有不同)