0

我正在深入阅读 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# 中的作用,但如果它来自上面的文本,我无法理解它与自动实现的属性有何关系。

4

2 回答 2

3

这段代码在静态方法中使用了对象初始化器语法。GetSampleProducts对象初始化器只能用于具有无参数构造函数的类型,因为它都是关于语法糖的。这个

var p = new Product { Name="West Side Story", Price = 9.99m }

在引擎盖下真的被翻译成这个

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

这意味着调用需要无参数构造函数var p = new Product();。在设置属性之前,它实际上会为每个项目调用。

构造函数是私有的,但就GetSampleProducts内部Product类型而言,它可以访问Product私有成员。如果您在此类之外尝试相同的语法,它将失败。

所以这

为了新的基于属性的初始化,您现在有一个私有的无参数构造函数。

实际上这里的意思是构造函数不用于自动实现的属性,它是基于属性的初始化所必需的(这个术语是指对象初始化器),如果你删除它,你会得到编译错误。

于 2018-05-13T19:54:16.400 回答
-2

不要在类中使用私有字段,然后在属性中使用,而是按原样返回私有字段:

private int age;

public int Age
{get {return age;}
 set {age = value}
}

通过自动植入,私有 int 在幕后创建。

自动实现属性的语法:

public int age {get; set;}
于 2018-05-13T12:55:20.060 回答