在自动生成的属性中实例化对象

时间:2013-02-12 19:35:23

标签: c#

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

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

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

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

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

有没有诀窍呢?

3 个答案:

答案 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#之间略有不同)