我已经阅读了这本书" 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;
没有实际拥有私有无参数构造函数。任何人都可以对它有所了解吗?
答案 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类的实例。希望它有所帮助。