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没有全局变量(正如一些评论所提到的:你可以模拟全局变量,但你不应该这样做)。

  • 全局属性仍然是有效的全局变量。请发布每个方法的一些示例代码以进行澄清,因为我不太确定您在说什么。如果您指的是静态属性和静态字段(C中唯一一种"全局变量"),那么这两种方法在"全局性"方面都同样糟糕——您应该尽可能避免使用全局字段和属性。
  • class globalvariables公共字符串mainoutputhexfile get;set;
  • 你的经理有发展背景吗?我被教育背景所玷污,这让我相信全球变数是一种内在的邪恶。
  • 上面是变量"mainOutputhExFile"的属性。使用此变量的另一种方法是将其声明为"global"。因为我需要这个变量,所以我的代码会被删掉。
  • 你的意思是"财产"还是"田地"?公共字符串s1;vs公共字符串s2 get;set;
  • 没错,达娜,我的意思是一样的。
  • asad:该声明不是全局变量。它是一个名为globalvariable的类,它定义了一个公共属性,该属性将其值存储在对象实例数据中。get;set;只是一个简写命令C编译器自动定义对象实例中属性的存储。
  • 是的,我也提到过它是一种财产。但是,与将其声明为gloabal变量相比,它的显著优势是什么呢?
  • 阿萨德:你真的需要用一些其他的术语来描述你的意思,这样我们才能更好地理解你的问题。C没有全局变量。您可以在C中定义的字段不是全局的-它们是类类型的成员。
  • 但当我将这些字段定义为公共字段时,它们就像是"全局变量",可以在代码中的任何地方访问。只是一个简单的问题,哪一个更安全使用,变量的"公共属性"或"公共字段"?
  • 属性必须是公共的,才能对其他类有用。无论是公共的还是私有的,通过属性而不是字段访问值总是一个很好的经验法则。
  • 为什么它总是一个好的经验法则。这有什么逻辑/原因或优势吗?


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

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

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

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

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

  • 我同意。我想他可能想创造一个单身汉。查看csharpindepth.com/articles/general/singleton.aspx,它向您展示了如何安全地实现singlton。
  • @Bitoff:一个很好的链接,也是我最近编辑的一个很好的同步思想的例子。同时也非常感谢1 Wiz,所以,乔恩·斯基特。(他写了那本书:stackoverflow.com/users/22656/jon skeet)


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访问器是只读的。

  • 实际上需要"属性"相对于"全局变量"的优势。一种比较
  • 好的回答,那么使用属性对gloabl变量的实际好处是什么?
  • "全局变量"更像是我们在脚本语言或vb6等语言中使用的一个术语。在强类型C中,所有数据都是已知类的实例或静态类上的数据的属性。就像没有任何自由浮动函数一样,只有方法和静态方法。
  • 你无法控制公共领域。类的用户可以将其设置为他们希望的任何值。没有验证、检查等…


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