【问题标题】:What is the purpose of private parameterless constructor in C#C#中私有无参数构造函数的目的是什么
【发布时间】:2013-04-22 16:15:47
【问题描述】:

我刚刚收到 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(){} 的目的是什么?

【问题讨论】:

    标签: c#-3.0


    【解决方案1】:

    这段代码:

    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)。

    【讨论】:

    • 感谢您的回复,乔恩。因此,私有构造函数在“幕后”被隐式调用。
    • @Tim:是的,没错。即使在无参数的情况下,您也可以使其明确:new Product() { Name = ..., Price = ... };
    • 如果没有定义/实现私有无参数构造函数会发生什么?
    • @user1767754:那么你总是必须在对象初始化器中指定构造函数参数,就像最后一个例子一样。
    • 你好,我刚买了你的书,有一个小东西。我已经用无参数构造函数粘贴了你的代码,VS 仍然说我不能使用初始化。因为它看不到私有构造函数,它希望我在初始化属性之前使用带参数的构造函数。也许我理解错了?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 2011-10-10
    相关资源
    最近更新 更多