【问题标题】:Why use properties over public fields? [duplicate]为什么在公共字段上使用属性? [复制]
【发布时间】:2015-07-10 10:46:08
【问题描述】:

我为什么要这样做:

public T X { get; set; }

而不是这个:

public T X;

人们(包括一些关于 SO 的答案)告诉我“如果你以后想改变行为怎么办?”是对此的答案,但事实并非如此,因为我可以将我的 public T X; 转换为

public T X {
    get { blabla; }
    set { blybly; }
}

编辑:在发布更多关于“阅读本文”和“阅读那个”的链接之前,您可以检查这些链接。其中 99% 主要包含引用其他链接的其他人,实际上没有人给出在字段上使用属性的适当理由。

这是一个流行答案的示例:“您可以将 setter 设为私有

public T X { get; private set; }

很明显,如果我想要一个私有的 setter,我会创建一个属性。但如果我不这样做,为什么不只使用一个字段?如果我后来决定我想要一个私人二传手,为什么我不能将我的字段从 public T X; 更改为 public T X {get; private set; }?

【问题讨论】:

  • “但这不是真的”——这取决于你是否关心二进制兼容性、源代码兼容性、反射兼容性......
  • 我脑海中只有一个区别:反射。当您突然将其更改为属性时,您会破坏检查字段的代码。
  • @CharlesMager 您发布的链接上没有正确的答案。
  • @Skamah One 该链接中有很多答案,我只是在其中阅读了它们,它们似乎是您在字段上使用属性的绝佳理由

标签: c# properties field


【解决方案1】:

我能想到的一件事就是这个。

  1. 使用您的类创建一个程序集,其中包含一个名为 X 的字段。
  2. 创建一个使用该类并设置 X 值的应用程序。
  3. 部署您的应用。
  4. 将类更新为属性,因为您需要 getter/setter 中的逻辑。
  5. 构建 DLL 并将其部署为更新。

当您运行它时,您将收到 System.MissingFieldException - 因为消费者应用程序最初是为查找字段而不是 get_X 方法而编写的。

您是否应该以这种方式部署您的应用程序是另一回事,但如果您是第 3 方代码提供者并且客户以这种方式使用您的库,那么它将使他们部署的应用程序崩溃。

【讨论】:

    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 2021-08-28
    • 2010-10-18
    • 2013-12-27
    • 1970-01-01
    • 2013-02-13
    • 2012-11-16
    • 2010-10-12
    相关资源
    最近更新 更多