私有无参数构造函数,用于新的基于属性的初始化

时间:2015-03-22 05:17:26

标签: c#

我已经阅读了这本书" C#in Depth"那个:

  

私有无参数构造函数用于新的基于属性的初始化。在下面的示例中,我们实际上可以完全删除公共构造函数,但之后没有外部代码可以创建其他产品实例。

using System.Collections.Generic;

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

但如上所述,我可以创建像

这样的新对象
List<Product> ls = Product.GetSampleProducts();
            Product o = new Product("a",2);
            ls.Add(o);
            listBox1.DataSource = ls;

没有实际拥有私有无参数构造函数。任何人都可以对它有所了解吗?

2 个答案:

答案 0 :(得分:3)

您可以像这样初始化对象:

 Product o = new Product( "a" , 2);

因为,它没有调用无参数构造函数。 为什么?

  

不带参数的构造函数称为无参数构造函数或默认值   构造函数。只要对象是,就会调用默认构造函数   通过使用new运算符和 实例化,没有参数   提供 到新的。

上面的代码调用public Product(string name, decimal price)构造函数,如您所见 public

毕竟,作者谈到了 新的基于属性的启动 。这意味着:

Product product = new Product { Column1 = "col1", Column2 = "col2" };

初始化这样的对象时,首先会调用 公共无参数构造函数

以上代码只是 语法糖

Product product = new Product(); // Compiler error in outside while default constructor is private
product.Column1 = "col1"; // Compiler error in outside while the set accessor is private
product.Column2 = "col2"; // Compiler error in outside while the set accessor is private

答案 1 :(得分:1)

基于属性的初始化要求存在无参数构造函数。正如@ farhad-jabiyev已经正确地声明了基于属性的初始化,例如

Product product = new Product { Name = "West Side Story", Price = 9.99m };

只是代码的语法糖,如下所示:

Product product = new Product();
product.Name = "West Side Story";
product.Price = 9.99m;

如果您在问题中提供的示例代码中注释私有无参数构造函数,您将收到编译错误:

  

没有任何论据符合所要求的形式参数&#39; name&#39; &#39; Product.Product(字符串,十进制)&#39;

这意味着在分配属性值之前,C#编译器会尝试调用无参数构造函数来创建Product类的实例。希望它有所帮助。