为什么在C#中对私有字段使用公共属性?

为什么在C#中对私有字段使用公共属性?,c#,properties,C#,Properties,如果我将一个类成员设为私有,然后我想访问该成员,那么必须为该成员定义一个公共属性。但是我想知道:如果我们可以通过声明类成员的公共属性来公开使用该类成员,那么为什么我们不将该类成员本身定义为公共的呢?因为您可以验证属性中的指定值。属性访问器(get,set方法)允许您在将来更改实现。例如,您可以从一个支持字段(私有类成员)开始,但稍后该属性可能会成为某些计算的结果。此外,属性语法允许您拥有只读成员,因此您只能在类内部更改值,外部世界只能读取该值。出于二进制兼容性的原因,Microsoft建议使用公

如果我将一个类成员设为私有,然后我想访问该成员,那么必须为该成员定义一个公共属性。但是我想知道:如果我们可以通过声明类成员的公共属性来公开使用该类成员,那么为什么我们不将该类成员本身定义为公共的呢?

因为您可以验证属性中的指定值。

属性访问器(get,set方法)允许您在将来更改实现。例如,您可以从一个支持字段(私有类成员)开始,但稍后该属性可能会成为某些计算的结果。此外,属性语法允许您拥有只读成员,因此您只能在类内部更改值,外部世界只能读取该值。

出于二进制兼容性的原因,Microsoft建议使用公共属性代替公共字段。只有在编写库(其他程序将访问该库)时,这才是一个问题

基本上,想象一下这个场景:

  • 创建一个带有公共字段的库
  • 其他人编写的程序使用您的库并访问该公共字段
  • 现在,您希望将字段更改为公共属性,因为您需要验证输入值,或者该属性已成为计算结果,或者您希望它抛出异常,因为它已过时,或者诸如此类
  • 用户尝试升级您的库,但不升级使用库的程序
这将完全破坏程序-它将停止工作,只会崩溃。但是,如果您从一开始就拥有公共财产权,而不是字段,则可以交换库


当然,这只与图书馆有关。在所有其他情况下,建议并不真正相关,如果愿意,可以使用字段。如果您以后发现需要一个属性,您仍然可以将其更改为属性,然后您的程序仍然可以正常编译。

以下是我们使用公共属性而不是公共字段的一些原因

  • 您可以在中编写更复杂的代码 获取/设置方法,而只有 字段中的单个值
  • 属性使您的代码更简单 “OO”。比如说一个叫做Person的类,我们 可以很容易地猜到有一个 在其中名为“Name”的属性。但是 名为“Name”的公共字段 奇怪
  • 某些属性适用于属性 仅限(AttributeTargets.Property)

  • 使用属性的原因很简单。根据您的工作,您始终可以在不中断任何外部程序的情况下更改代码处理获取/设置其值-这在字段中是不可能的。此外,属性可以标记为虚拟属性,因此可以由子类重新定义,而不会破坏任何兼容性。

    你在问什么?那(一句话)是无法理解的。我已经对它进行了大量的编辑。我想这就是他的意思。我认为最后一句“…首先是私人的”应该改为“…首先是公共的”。这句话的可能重复并不是一个真正的论点,因为如果你以后发现有必要这样做,你仍然可以介绍该物业。@Timwi,我认为将成员更改为属性将强制使用.dll中的类型的代码重新编译。虽然这对大多数人来说不是问题,但如果您是为第三方用户分发.dll,则应该避免这种情况。是的,但正如您自己指出的,它只适用于库。您的答案没有说明这一点。此参数适用于只读属性,但不适用于读/写属性。如果你后来发现需要一个属性,因为它变成了一个计算值,那么你仍然可以引入这个属性。非常好的解释。