可能重复:
c#: why have empty get set properties instead of using a public member variable?
string name;
VS
string name {get; set;}
假设你的get和set如上所述是空白的,那么指定它们有什么意义呢?
答案 0 :(得分:23)
它封装了编译器生成的字段,并为您提供了class
或struct
开发人员在以后内部更新它的能力,而无需通过简单地修改get
/ {{来破坏您的API 1}}你关心的部分。
例如,突然之间永远不想回归set
?您只需将空null
更改为get
即可。当然,这意味着您突然需要手动控制变量,但这只是为了灵活性而付出的代价。
首次使用是field声明的示例。第二个用途是auto-implemented property的示例。
提供对字段的直接访问通常是不好的做法。然而,.NET团队注意到很多getter / setter基本就是这样。例如,请考虑以下事项:
get { return storedName ?? ""; }
无论哪种方式,真正暴露一个领域真是太多了。但是,通常情况下,作为开发人员,您需要返回并更改内部处理字段的方式,但如果您可以获得 想要破坏甚至影响其他代码远离它。
这就是使用直接访问字段的原因。如果您提供对字段的直接访问,但需要更改使用该字段的内容,则使用该字段的所有代码也必须更改。如果使用属性(甚至是方法),则可以更改内部代码,并且可能不会影响外部代码。
考虑以下示例:
// C#
public string Name
{
get { return name; }
set { name = value; }
}
// Without properties (or a Java implementation)
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
稍后您决定需要在setter周围引发更改和更改事件。如果你暴露了一个字段,那么是时候进行重大的重写了。如果您使用了属性(或方法),那么您可以在那里添加逻辑。您突然失去了自动实现属性的好处,但您获得了重构类的能力而不会破坏现有代码。
public string Name
{
get;
set;
}
所有这些都维护着您的公共API,并且不需要该类用户(代码的其余部分或使用您的API的外部开发人员)的工作。突破性变化并不总是可以避免,但避免直接访问字段是尝试确保不会发生变化的一个很好的步骤。自动实现的属性是一种快速,简便的方法。
(不相关:打字时失去了力量,我很高兴我的浏览器保存了大部分内容!)
答案 1 :(得分:1)
第一个实际上是Field,但第二个是Auto-Implemented property。它们之间的区别has already been discussed。
答案 2 :(得分:1)
第一个,假设它在类范围内声明,是一个字段名称。它作为一个字段访问。第二个是财产。空白获取/设置称为自动属性。
答案 3 :(得分:1)
将来可能需要在访问者中实际执行某些操作。将字段(这是您的第一个声明)更改为属性是一个重大变化,因此提前指定访问者是一项很小的投资。
答案 4 :(得分:1)
能够在不破坏兼容性的情况下向字段的访问者添加逻辑是标准的解释,如果您正在编写可以独立更新的多个程序集中的库或应用程序,那么它肯定是一个很大的问题。我认为,如果您正在使用任何类型的“一体化”软件,那么人们可以忽视这一点,因为它无论如何都会被重新编译。
但即便如此,还有另一个非常令人信服的理由只在公共接口中公开属性:即使您永远不需要进行任何内部更新,使用字段仍然可能导致其他问题,因为很多部分.NET框架非常喜欢属性到字段。例如,WPF通常不支持绑定到字段。你可以通过执行ICustomTypeDescriptor这样的花哨的东西来解决这个问题,但是简单地输入{get;设置;}
答案 5 :(得分:0)
string name {get; set;}
这称为自动实施属性。实际上,C#创建以_本身开头的变量,所以在get中,获取该变量值并在设置时设置该变量值。它就像普通的属性一样。 string name;
只是一个字段。
答案 6 :(得分:0)
第一个是变量,第二个是(缺少的)属性
答案 7 :(得分:0)
属性非常好,但作为一般规则,对象不应向公众公开状态;从外人的角度来看,它们应该是一个黑盒子。而且你尤其不应该声明直接改变。状态应该改变为要求对象实例在问题域中执行有用的操作的副作用。
如果您要公开状态,请将其公开为只读属性(例如public widget Foo { get ; private set ; }
)。