2012-07-10 56 views
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); 
    } 
} 
+0

我认为你需要提供有关*上下文的详细信息*特别是关于你曾见过的项目。 – npinti 2012-07-10 08:49:16

回答

4

一旦你创建了一个带参数的构造函数,你的默认参数less构造函数就消失了。现在,如果您希望对象在未提供任何值的情况下进行初始化,则必须明确声明一个参数较少的构造函数。这取决于你想如何使用它,如果你希望只用这些值初始化对象,如果你的对象无效,不用它们,那么不要添加无参数的构造函数。但是,如果与参数的构造函数只是初始化一些值对象的方式,你总是可以如下初始化对象使用C#3.0对象初始

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

这可能是因为系列化。

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

我常常更加明确,通过添加过时属性:

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

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

而且

Product() {} 

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