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