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

时间:2010-12-15 05:16:49

标签: c# properties field

编辑,根据这些评论:

  

你的意思是“财产”与“战场”吗?   public String S1; vs public String S2   {get;组; } - dana

     

完全是dana,我的意思是一样的。 - Asad

     

阿萨德:你真的需要尝试使用   用一些其他术语来形容你   意思是让我们更好地理解   你的问题。 C#没有全球性   变量。您可以定义的字段   在C#中不是全球性的 - 它们是   类类型的成员。 - dthorpe

你好fellas,

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

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

谢谢和问候

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

4 个答案:

答案 0 :(得分:11)

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

还想象一下尝试保护字段以进行线程同步。您必须在代码中访问该字段的所有位置编写额外的代码。要使用属性执行此操作,您只需将getter和setter包含在一个位置即可。 (但要注意!如果你正在处理可变类型,那么在属性getter和setter中使用lock的容易程度会给你一种错误的安全感。See the accepted answer in this post.

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

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

为避免单身人士或“全球”数据出现问题,请查看dependency injection作为更好的选择。

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:3)

查看Properties (C# Programming Guide)

  

属性是提供a的成员   灵活的读,写或者机制   计算私有字段的值。   可以使用属性,就像它们一样   公共数据成员,但他们是   实际上称为特殊方法   存取。这样可以实现数据   轻松访问,仍然有帮助   促进安全性和灵活性   方法

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

答案 3 :(得分:0)

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