4

我刚刚收到Jon Skeet 在邮件中的C# in Depth并且没有关注第 7-8 页的讨论。

为了新的基于属性的初始化,我们现在有一个私有的无参数构造函数。(第 8 页)

我不清楚基于属性的初始化如何需要无参数的构造函数,如果这就是“为了”所暗示的。

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(){}
   .
   .
   .
}    

目的是Product(){} 什么?

4

1 回答 1

9

这段代码:

Product p = new Product { Name = "Fred", Price = 10m };

相当于:

Product tmp = new Product();
tmp.Name = "Fred";
tmp.Price = 10m;
Product p = tmp;

所以仍然需要无参数构造函数——它只是在示例代码中的类中调用,所以它可以是私有的。

这并不是说所有的对象初始化器都需要一个无参数的构造器。例如,我们可以:

// Only code within the class is allowed to set this
public string Name { get; private set; }
// Anyone can change the price
public decimal Price { get; set; }

public Product(string name)
{
    this.Name = name;
}

然后像这样在任何地方使用它:

Product p = new Product("Fred") { Price = 10m };

当然,本书后面会有更多细节(第 8 章 IIRC)。

于 2013-04-22T16:17:56.610 回答