为什么我们每次都声明一个私有的无参数构造函数

时间:2012-07-10 08:45:27

标签: asp.net-mvc-3 c#-4.0 entity-framework-4 c#-3.0

我在我的项目中已经看到了这个

 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);
    }
 }

3 个答案:

答案 0 :(得分:4)

使用参数创建构造函数后,默认参数less constructor就会消失。现在,如果您希望在不提供任何值的情况下初始化对象,则必须显式声明参数less constructor。这取决于您希望如何使用它,如果您希望仅使用这些值初始化对象,如果您的对象无效,则不使用它们,则不要添加参数较少的构造函数。但是,如果带参数的构造函数只是使用某些值初始化对象的一种方法,那么您始终可以像使用C#3.0对象初始化程序一样初始化对象

 var product = new Product{Name = "Some Name", Price = 10.0};

答案 1 :(得分:1)

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

Product() {}

是内部的,而不是私人的。

答案 2 :(得分:0)

可能是因为序列化。

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

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

[Obsolete("This constructor is for deserialization only", true)]
private Product() { }