在C#中,是什么使字段与属性不同?何时应该使用字段而不是属性?


当前回答

一个重要的区别是接口可以有财产,但不能有字段。对我来说,这强调了财产应该用于定义类的公共接口,而字段则用于类的私有内部工作。通常,我很少创建公共字段,类似地,我也很少创建非公共财产。

其他回答

在后台,属性被编译为方法。因此,Name属性被编译为get_Name()和set_Name(字符串值)。如果您研究编译的代码,您可以看到这一点。因此,在使用它们时会有(非常)小的性能开销。通常,如果向外部公开字段,则始终使用Property,如果需要验证值,则通常在内部使用Property。

字段是类的普通成员变量或成员实例。财产是获取和设置其值的抽象。财产也称为访问器,因为如果您将类中的字段公开为私有字段,则它们提供了更改和检索字段的方法。通常,您应该将成员变量声明为私有的,然后为它们声明或定义财产。

  class SomeClass
  {
     int numbera; //Field

     //Property 
    public static int numbera { get; set;}

  }

此外,财产允许您在设置值时使用逻辑。

因此,如果值大于x,您可以说只想将值设置为整数字段,否则将引发异常。

非常有用的功能。

(这真的应该是一条评论,但我不能发表评论,所以如果不适合作为帖子,请原谅)。

我曾经在一个地方工作,推荐的做法是使用公共字段而不是财产,而等效的属性def只访问字段,如:

get { return _afield; }
set { _afield = value; }

他们的理由是,如果需要的话,公共领域可以在未来晚些时候转化为财产。当时我觉得有点奇怪。从这些帖子来看,这里似乎也没有多少人会同意。你可能会说些什么来改变现状?

编辑:我应该补充一点,这里的所有代码库都是同时编译的,所以他们可能认为更改类的公共接口(通过将公共字段更改为属性)不是问题。

来自维基百科——面向对象编程:

面向对象编程(OOP)是一种基于“对象”概念的编程范式,“对象”是以字段形式包含数据的数据结构,通常称为属性;和代码,以过程的形式,通常称为方法。(添加强调)

财产实际上是对象行为的一部分,但其设计是为了给对象的消费者提供使用对象数据的幻觉/抽象。