自动实现的属性是否使用私有构造函数进行初始化

时间:2018-05-13 12:42:56

标签: c# automatic-properties private-constructor

我正在深入阅读Jon Skeet的C#,并在 C#3 中找到了自动实现属性的解释。

这个代码是:

companion object{
    //Other declarations

    init{
        if (BuildConfig.DEBUG) {
            var interceptor = HttpLoggingInterceptor();
            interceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
            builder.addInterceptor(interceptor);//I have no clue where you define builder, but I'm assuming you've done it *somewhere* and just left it out of the question
        }
    }
}

解释这一点的文字是

  

现在这些属性没有与它们相关联的任何代码(或可见变量!),并且您正以非常不同的方式构建硬编码列表。由于没有名称和价格变量可供访问,因此您不得不在类中的任何位置使用这些属性,从而提高一致性。 为了新的基于属性的初始化,您现在拥有一个私有的无参数构造函数。 (在设置属性之前,会为每个项调用此构造函数。)在此示例中,您可以完全删除公共构造函数,但之后没有外部代码可以创建其他产品实例。

我无法将头部包裹在以粗体标记的部分周围。它表示私有构造函数用于自动实现的属性,并且每次设置之前都会调用它。然而,即使我把控制台放在那里它也没有被调用。即使删除了私有构造函数,代码也运行良好。

我知道私有构造函数在C#中的作用,但我无法理解它是如何与自动实现的属性相关的,如果它来自上面的文本。

2 个答案:

答案 0 :(得分:2)

这段代码在GetSampleProducts静态方法中使用object initializer syntax。 对象初始值设定项只能用于具有无参数构造函数的类型,因为它完全与语法糖有关。 此

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个私有成员。如果你在这个类之外尝试相同的语法,它将会失败。

所以,这个

  

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

实际上意味着构造函数不用于此处的自动实现属性,基于属性的初始化(此术语表示对象初始值设定项)需要,如果删除它,你会得到编译错误。

答案 1 :(得分:-2)

而不是在课堂上使用私人领域&然后在属性中,您将按原样返回私有字段:

private int age;

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

使用自动植入,私有int会在幕后创建。

自动实现属性的语法:

public int age {get; set;}