【发布时间】:2018-10-23 06:47:58
【问题描述】:
我正在深入阅读 Jon Skeet 的 C#,并在 C# 3 中看到了关于自动实现属性的解释。
代码如下:
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}
};
}
}
解释这一点的文字是
现在属性没有任何代码(或可见变量!)与它们相关联,并且您正在以非常不同的方式构建硬编码列表。由于没有名称和价格变量可供访问,您不得不在类中的任何地方使用属性,从而提高一致性。 为了新的基于属性的初始化,您现在有一个私有的无参数构造函数。 (在设置属性之前为每个项目调用此构造函数。) 在此示例中,您可以完全删除公共构造函数,但外部代码无法创建其他产品实例。
我无法绕开粗体标记的部分。它说私有构造函数用于自动实现的属性,并且每次在设置之前都会调用它。但是,即使我在那里放了一个控制台,它也没有被调用。即使删除了私有构造函数,代码也运行良好。
我知道私有构造函数在 C# 中的作用,但如果它来自上面的文本,我无法理解它与自动实现的属性有何关系。
【问题讨论】:
-
重点是,无论如何都应该调用构造函数。如果你真的想使用对象初始化语法,你实际上可以用这种无意义的语法创建一个新产品 new Product("West Side Story", 9.99m) { Name="West Side Story", Price = 9.99m } 如果你删除了两个构造函数,那么编译器会为你构建一个空的,但是如果你删除显式声明的一个,那么示例代码将失败,因为唯一可用的构造函数需要两个参数。
标签: c# automatic-properties private-constructor