C#中`Fields`和`Properties`有什么区别?

根据这些评论编辑:

你的意思是“财产”与“战场”吗? public String S1; vs public String S2 {get; 组; – 达娜

完全是达娜,我的意思是一样的。 – 阿萨德

阿萨德:你真的需要尝试用其他术语来描述你的意思,这样我们才能更好地理解你的问题。 C#没有全局变量。 您可以在C#中定义的字段不是全局的 – 它们是类类型的成员。 – dthorpe

嗨fellas,

需要您对FieldProperty之间差异的专家意见。 在我的项目中,我使用了某些全局变量,后来我改为“属性”。 我的经理问的是使用变量Properties而不是Fields什么好处。

虽然我已回复他, Property提供了一种安全/安全/间接访问Field而不是直接修改它们,如果它们被宣布为publicprotected 。 但请给我一些更有说服力的论据。

感谢致敬

@Asad:你应该把你的术语说得对: Fields不是Global Variables ,C#没有全局变量(正如一些评论者提到的:你可以模拟全局变量,但你不应该这样做)。

主要优点是您可以将各种function附加到属性,例如validation,同步等。您不能为类字段执行此操作。 例如,一个字段可以在赋值时抛出BCLexception,但它不能抛出一个对你的问题域中的逻辑有意义的exception。

还想象一下尝试保护字段以进行线程同步。 您必须在代码中访问该字段的所有位置编写额外的代码。 要使用属性执行此操作,您只需将getter和setter包含在一个位置即可。 (但要注意!如果你正在处理可变类型,那么在属性getter和setter中使用lock的容易性可能会给你一种错误的安全感。 请参阅这篇文章中接受的答案。 )

现在,您可能认为validation和同步对于此特定值并不重要,并且它们可能永远不会用于此特定实例。 但是通过使用属性而不是直接字段访问,可以使您的应用程序在将来更易于维护。 (假设整数字段的值突然需要来自与原始实现不同的源,并且需要将其从字符串转换为int。如果使用属性来包装字段,则在一个位置进行更改,使用该属性的所有客户端代码根本不需要更改!)

此外,为了管理跨许多类(全局)共享的信息,请查看单例模式 。 但要小心! 即使它看起来整洁干净,你仍然会遇到麻烦。 虽然如果你真的需要全局数据,你应该使用单例中包含的属性。 如果不出意外,这是一个很好的组织策略。

为了避免单例或“全局”数据的问题,请将dependency injection视为更好的替代方案。

C#语法没有“全局变量”声明。 它具有属性和字段,以及静态属性和字段。

如果“全局变量”是指静态字段或静态属性,则与属性或字段的不同之处在于静态字段或属性未存储在对象实例数据中,它存储在全局内存中。 分配给静态字段或属性的值可供该类的所有实例访问,并且所有实例都看到相同的值。 静态字段是C#与其他编程语言中的“全局变量”概念最接近的事物。

非静态属性或字段将其数据存储在对象实例数据中,因此该对象的每个实例都有自己的本地副本。 修改object1.A属性不会影响object2.A属性的值。

看一下Properties(C#编程指南)

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

  • 属性使类能够公开获取和设置值的公共方式,同时隐藏实现或validation代码。
  • get属性访问器用于返回属性值,set访问器用于分配新值。 这些访问者可以具有不同的访问级别。
  • 未实现set访问器的属性是只读的。

我更喜欢属性,因为当我在代码中使用它时,我确切地知道用于调用它们的类(例如class.property = value)。 当您试图在调试过程中弄清楚它们来自何处时,公共类变量可能会成为一种真正的痛苦和浪费时间。