自动生成属性中的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
我想你是否可以给自动实现的属性赋予初始值。 这个问题的答案是“不”。
你可以写一个手工财产:
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#之间略有不同)