C#:我可以删除“{get; 组; }”?

是否有区别:

public T RequestedValue { get; set; } 

 public T RequestedValue; 

取自此代码:

 public class PropertyChangeRequestEventArgs:EventArgs { public PropertyChangeRequestEventArgs(T pRequestedValue) { RequestedValue = pRequestedValue; } public T RequestedValue { get; set; } } 

第一个是Auto-Implemented属性 ,第二个是Field 。 常规属性公开Getters和Setter,但有一个私有字段来实际存储值:

 private int someProperty; public int SomeProperty { get { return someProperty; } set { someProperty = value; } } 

第一个允许您更改类的实现的某些方面,而不会影响应用程序中的所有其他代码。 最重要的一点是,通过属性,可以在不破坏二进制兼容性的情况下进行更改(尽管通常可以在不破坏代码的情况下将字段更改为属性)。 如果是公共会员,建议您使用酒店。 (从Snarfblam的评论中无耻地偷窃)

从“属性”页面:

属性是提供灵活机制来读取,写入或计算私有字段值的成员。 属性可以像它们是公共数据成员一样使用,但它们实际上是称为访问器的特殊方法。 这样可以轻松访问数据,并且仍然有助于提高方法的安全性和灵活性。

具有支持字段的属性是最灵活的forms,因为它们可以轻松实现诸如INotifyPropertyChanged事件之类的事件,以便在Model-View-ViewModel实现中更新UI。

深刻的解释!

{get; set;}是一个自动属性,而第二个是一个字段。

字段是包含数据的某种类型的普通变量。

属性是一些方法(有时它只是一个),一个用于获取,一个用于集合。 它们只有字段之类的语法,但实际上它们却完全不同。

属性通常用于过滤值集,或者在get中虚拟化某些内容等。

自动属性,也在幕后创建一个私有字段,在get中返回其值,并在集合中设置其值。

看起来这就像一个普通的领域,但是使用属性的幕后(IL)与使用领域完全不同。

  a.Property1 = 4; 

翻译成如下:

  a.Set_Propert1(4); 

还有这个:

 x = a.Property1; 

翻译成这样的东西:

 x = a.Get_Property1(); 

那么为什么仅使用公共财产是好的做法,即使它们是自动的?

假设你正在编写一个由其他应用程序使用的库,并且有一天你想发布一个新版本的库,它限制了你的一个类的字段。

如果您正在使用属性,则可以只更改属性(即使它是自动属性,您可以将其替换为完整属性),然后使用您的库的任何应用程序仍然可以以相同的方式使用它。

但是如果你创建了一个你想要约束的公共字段,你需要为此创建一个属性并将该字段设为私有,但是如果你愿意的话,任何使用你库的应用程序都不会被打包,因为它使用字段和属性的方式是不同的。

你可以写:

 public T RequestedValue { get; set; } 

作为捷径:

 private T _requestedValue; public T RequestedValue { get { return this._requestedValue; } set { this._requestedValue = value; } } 

它们完全相同,也考虑了性能。

答案是,是的你可以删除{get; 组; 然而,有些人会说场和属性表达了截然不同的设计意图,但实际上,随着C#的演变和逐步模糊语法差异,这种区别已被侵蚀多年。

有关字段和属性之间的编译器 – 二进制级别差异的良好列表,请参阅SO – question – properties -between-field-in-c 。 但是这个问题的答案在声明接口时忽略了属性的特殊作用。