有没有办法自动实例化对象而不在构造函数中实例化它?
实际上,我有类似的东西:
public List<Object> Products { get; set; }
public MyClass()
{
this.Products = new List<Object>();
}
但相反,我想直接实现我的列表而不在我的类的构造函数中指定类似的东西:
public List<Object> Products = new List<Object>(); { get; set; }
有没有诀窍呢?
答案 0 :(得分:4)
我想您是否可以为自动实施的属性提供初始值。这个问题的答案是“不”。
你可以写一个手工财产:
private List<Product> products = new List<Product>();
public List<Product> Products
{
get { return products; }
set { this.products = value; }
}
你真的需要安装者吗?您是否需要客户能够用另一个列表替换变量值?您可能会发现只需要一个只读属性,在这种情况下,您可以写:
private readonly List<Product> products = new List<Product>();
public IList<Product> Products { get { return products; } }
请注意,您仍然可以使用集合初始值设定项,例如
Foo foo = new Foo
{
Products = { new Product("foo"), new Product("bar") }
};
答案 1 :(得分:3)
Jon Skeet说:
不幸的是,现在没有办法做到这一点。你有 在构造函数中设置值。 (使用构造函数链接即可 有助于避免重复。)
现在自动实现的属性很方便,但可以 当然更好。我发现自己并不想要这种 初始化通常是只读的自动实现 只能在构造函数中设置的属性 由只读字段支持。这两种情况都有可能发生 固定在C#5中,我强烈希望它能解决不变性问题 关注。 (我不认为他们中的任何一个都安排在C#4上。)
来源:Initializing C# auto-properties
如果您需要初始化property
without using the constructor
,则需要使用backing field
。
实施例
class Demo
{
private List<object> myProperty = new List<object>();
public List<object> MyProperty
{
get { return myProperty; }
set { myProperty = value; }
}
}
答案 2 :(得分:1)
在C#中,目前没有自动生成的属性(尽管VB.NET自动属性可以执行此操作)。这是我自己常常希望的。因此,您可以手动滚动自己的属性,或使用构造函数。
无论哪种方式,你都会有一些代码,你希望你不必编写这样做(没有构造函数的手动属性与构造函数的auto-property)。
有趣的是,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#之间略有不同)