1

我在我的项目中看到了这一点

 class Product
 {
    public string Name { get; private set; }
    public decimal Price { get; private set; }
    public Product(string name, decimal price)
    {
        Name = name;
        Price = price;
    }
    Product() {}
    public static List<Product> GetSampleProducts()
    {
        return new List<Product>
          {
             new Product { Name="West Side Story", Price = 9.99m },
             new Product { Name="Assassins", Price=14.99m },
             new Product { Name="Frogs", Price=13.99m },
             new Product { Name="Sweeney Todd", Price=10.99m}
          };
    }
    public override string ToString()
    {
        return string.Format("{0}: {1}", Name, Price);
    }
 }
4

3 回答 3

4

一旦你创建了一个带参数的构造函数,你的默认无参数构造函数就消失了。现在,如果您希望在不提供任何值的情况下初始化对象,则必须显式声明无参数构造函数。这取决于您要如何使用它,如果您希望仅使用这些值初始化对象,而如果您的对象无效则不使用它们,则不要添加无参数构造函数。但是,如果带参数的构造函数只是用某些值初始化对象的一种方式,则始终可以像使用 C# 3.0 Object Initializer 一样初始化对象,如下所示

 var product = new Product{Name = "Some Name", Price = 10.0};
于 2012-07-10T09:12:08.917 回答
1

ORM 映射器、反序列化等需要它来自动创建对象。

Product() {}

是内部的,不是私有的。

于 2012-07-10T08:52:48.757 回答
0

可能是因为序列化。

如果您的对象没有无参数构造函数,那么大多数通过反射工作的反序列化器将无法创建对象的实例,因为它不知道要传递哪些参数。

我经常通过添加 Obsolete 属性来明确这一点:

[Obsolete("This constructor is for deserialization only", true)]
private Product() { }
于 2012-07-10T08:50:16.533 回答