16

可能的重复:
为什么要使用 getter 和 setter?
C# 3.0 自动属性 ​​- 有用与否?

通过以下方式定义属性是否有区别 -

// 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;}

据我所知,它看起来只是一种风格偏好。我错过了什么吗?

4

5 回答 5

26

差异:

  • 第二种形式只能使用 C# 3 编译器或更高版本进行编译
  • 第二种形式不允许任何代码(即使在同一个类中)直接访问该字段,因为真正的字段有一个“难以形容的名字”

第二个版本是所谓的自动实现属性(或简称“自动属性”)。它们是在 C# 3 中引入的。如果您只编写看起来像第一个版本的代码 - 即不涉及逻辑 - 那么自动属性非常好。您可以随时通过将其转换为第一种形式来添加逻辑。在源代码和二进制兼容性方面,您的所有代码都将与该更改兼容。

请注意,在 C# 6 之前的版本中,自动属性不允许您指定默认值,并且不存在真正的只读自动属性(即没有 getter 的属性)。最接近的是带有私人二传手的公共吸气剂,例如

public string Name { get; private set; }

它并不完全相同,但在许多情况下它已经足够接近了。

于 2011-02-07T16:23:47.977 回答
2

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

于 2011-02-07T16:24:37.867 回答
0

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

http://msdn.microsoft.com/en-us/library/f7dy01k1%28v=VS.90%29.aspx

于 2011-02-07T16:23:45.230 回答
0

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

于 2011-02-07T16:24:21.670 回答
0

不会。实际上,当您使用较短的版本 ( public string Name { get; set; }) 时,编译器会自动为该属性生成一个私有字段。

于 2011-02-07T16:25:04.703 回答