C中的”fields”和”properties”有什么区别?

What is the difference between `Fields` and `Properties` in C#?

本问题已经有最佳答案,请猛点这里访问。

根据这些注释编辑:

Do you mean"Property" vs"Field"?
public String S1; vs public String S2
{ get; set; } – dana

Exactly dana, i mean the same. – Asad

Asad: you really need to try to use
some other term to describe what you
mean so that we can better understand
your question. C# does not have global
variables. The fields you can define
in C# are not global - they are
members of the class type. – dthorpe

嗨,伙计们,

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

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

谢谢和问候

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


主要的优点是可以将各种功能附加到属性上,例如验证、同步等。对于类字段不能这样做。例如,一个字段可以在赋值时抛出BCL异常,但它不能抛出对问题域中的逻辑有意义的异常。

还可以想象尝试为线程同步保护一个字段。您必须在代码中访问字段的所有位置编写额外的代码。要使用属性实现这一点,只需在一个地方用锁包装getter和setter。(但要当心!如果您使用的是可变类型,那么在属性getter和setter中使用锁的简单性可能会给您一种错误的安全感。请参阅本帖中接受的答案。)

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

此外,为了管理跨多个类(全局)共享的信息,请看一下单例模式。但是当心!即使它看起来干净整洁,你还是会遇到麻烦的。但是,如果您确实需要全局数据,那么应该使用单例中包含的属性。如果没有别的,这是一个好的组织策略。

为了避免单例数据或"全局"数据的问题,可以将依赖注入视为更好的选择。


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

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

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


查看属性(C编程指南)

A property is a member that provides a
flexible mechanism to read, write, or
compute the value of a private field.
Properties can be used as if they are
public data members, but they are
actually special methods called
accessors. This enables data to be
accessed easily and still helps
promote the safety and flexibility of
methods.

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


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