C#获取者、设定者宣言

C#获取者、设定者宣言,c#,syntax,getter,getter-setter,C#,Syntax,Getter,Getter Setter,可能的重复项: 以下方式定义属性之间是否有区别- // private, with getter & setter private string fName; public string Name { get { return this.fName } set { this.fName = value } } // define as a Property public string Name { get; set;} 据我所知,这只是一种风格偏好。我遗漏了什么吗

可能的重复项:

以下方式定义属性之间是否有区别-

// private, with getter & setter
private string fName;
public string Name
{
    get { return this.fName }
    set { this.fName = value }
}

// define as a Property
public string Name { get; set;}

据我所知,这只是一种风格偏好。我遗漏了什么吗?

答案在IL中。使用ildasm并进行比较

差异:

  • 第二种形式只能使用C#3编译器或更高版本编译
  • 第二种形式不允许任何代码(即使在同一个类中)直接访问该字段,因为实际字段有一个“无法说出的名称”
第二个版本称为自动实现的属性(简称“自动属性”)。它们是在C#3中引入的。如果您只编写看起来像第一个版本的代码,也就是说,没有涉及逻辑,那么自动属性非常好。您可以在以后通过将逻辑转换为第一种形式来添加逻辑。在源代码和二进制兼容性方面,您的所有代码都将与该更改兼容

请注意,在C#6之前的版本中,自动属性不允许指定默认值,并且没有真正的只读自动属性(即没有getter的自动属性)。你能达到的最接近的目标是一个公共的接受者和一个私人的接受者,例如

公共字符串名称{get;private set;}

这并不完全相同,但在许多情况下都足够接近。

最终,在这种情况下,它的结果是相同的。当您想要对获取/设置应用任何规则时,就会出现这种差异,在这种情况下,您需要使用private/protected变量并将其隐藏在公共属性后面。

第一个是标准属性。必须定义用于存储值的字段。第二个是,仅在C#3.0及更高版本中可用。

否。实际上,当您使用较短版本(
公共字符串名称{get;set;}
)时,编译器会自动为属性生成一个私有字段

事实上不是——这个问题以前已经被问过很多次了。@ChrisF这肯定是个骗局,但我认为你得到的不太正确duplicate@Daniel-这是我发现的第一个,由于系统允许多个可能的副本,所以这不是一个真正的问题。或者“自动属性”更简短;)