【问题标题】:Why have empty get set properties instead of using a public member variable? [duplicate]为什么使用空的 get set 属性而不是使用公共成员变量? [复制]
【发布时间】:2010-12-24 23:23:33
【问题描述】:

可能重复:
C#: Public Fields versus Automatic Properties

重复?我认为不是:
这个问题与“为什么 使用属性而不是公共 字段”。具有指定的属性 getter 和 setter 有很大的不同 而不是公共领域。我的问题是, 是一个属性没有一个吸气剂和 二传手,任何不同。

最近有了空 getter 和 setter 的能力,使用它们而不是仅仅声明一个公共成员变量有什么好处?

例子:

public string MyProperty
{
    get;
    set;
}

对比:

public string MyProperty;

【问题讨论】:

  • 这是stackoverflow.com/questions/1180860/… 的一个相当简单的副本,基本上是众多“为什么我应该使用属性而不是公共字段?”的副本。问题。
  • 这个问题与“为什么使用属性而不是公共字段”不同。具有指定 getter 和 setter 的属性与公共字段大不相同。我的问题是,没有 getter 和 setter 的属性有什么不同。
  • 没有getter和setter的属性不是属性,而是字段。
  • @Cameron。事实并非如此。具有空 getter 和 setter 的属性是属性而不是字段。编译器在后台填充后台字段。
  • (这里晚了很多)如问题所述,具有空 getter 和 setter 的属性与没有 getter 和 setter 的属性不同。

标签: c# properties


【解决方案1】:

一个字:继承。

属性是可继承的,而字段则不是。您可以在继承的类中使用字段,但不能通过使它们成为虚拟来改变它们的行为。

像这样:

public class Foo {
  public virtual int MyField = 1; // Nope, this can't

  public virtual int Bar {get; set; }
}

public class MyDerive : Foo {
  public override MyField; // Nope, this can't

  public override int Bar {
    get {
      //do something;
    }
    set; }
}

编辑:除了继承的事实外,其他答案中指出的要点(如可见性)也是属性相对于字段的巨大优势。

【讨论】:

  • 在什么情况下公共字段不被派生类继承?还是我误会了你?
  • 您可以将它们设为虚拟并在派生类中覆盖它们。
  • 这件事让我很害怕。覆盖自动属性似乎很奇怪。由于在后台框架正在旋转一个私有成员来实际存储属性的值,似乎通过覆盖它你可能会做一些意想不到的事情。我倾向于将自动属性标记为不可覆盖。我不能完全确定它,但它看起来......很奇怪。
  • 为什么要吓人?考虑使用具有虚拟(不一定是抽象的)自动实现属性的抽象类。如果这些不是可以覆盖恕我直言,那将是很遗憾的。
  • 我不认为你可以有 "set;"如果你已经给了一个身体得到
【解决方案2】:

你可以用属性做的一件事是你不能用字段做的就是限制 setter 或 getter 的可见性:

public string MyProperty { get; private set; }

我经常使用的东西。

你不能用字段做的事情(更强大的)是在接口中定义它们。假设您想要一个需要实现类的接口具有特定属性:

public interface MyInterface
{
    string MyProperty { get; }
}

请注意,这里不需要设置器。完全取决于实现类来确定它们应该如何设置MyProperty

【讨论】:

  • 你打败了我 :-)。即使实现为空,也有单独的访问修饰符。
  • 可能值得指出的是,您可以通过将您的字段声明为只读来做一些非常相似的事情(尽管没有一半强大),这样做只能在构建时分配。
【解决方案3】:

字段不能在接口中公开。如果需要,可以随时将自动属性更改为“普通”属性,而无需更改类的签名和接口。

一般来说,字段被认为是一个实现细节,在未来的代码版本中可能会发生变化。因此,您应该通过方法和属性公开数据,为将来不影响使用该类的代码的内部更改留出空间。

【讨论】:

  • 好答案,澄清一下:将字段更改为属性实际上是一项重大更改,因为它不保留二进制兼容性。一个例子是该类的某些用户可能正在对其进行一些反思,而 FieldInfo 与 PropertyInfo 完全不同。其他答案中提到了其他示例。
  • 感谢您的澄清,这就是我的意思。 ;)
【解决方案4】:

与简单的公共字段相比,属性为您提供了几个优势:

  • 您可以控制属性是只读、只写还是读/写
  • 您可以隐藏实际的实现(也许在设置器中您想要做的不仅仅是设置一个值)
  • 使用数据绑定时(例如在 ASP.NET 中),您必须使用属性(不适用于字段)

【讨论】:

    【解决方案5】:

    想到了紧耦合。使用公共字段删除了通过使用属性提供的抽象层。使用私有字段和属性可以隐藏其他类的实现,并有助于在需要更改时隔离它们(外部类)。

    另外,请记住,您指的是 auto-implemented properties,它会导致编译器为您创建支持字段,而不是您必须为类中的每个属性手动创建支持(私有)字段。

    【讨论】:

    • 是的。隐藏你的隐私!
    • 哈哈哈 - 从来没有这样听说过 :) 太棒了!来自我的 +1。
    【解决方案6】:

    这个想法是通过调用代码来管理对象内部的值,状态,避免损坏和滥用。

    【讨论】:

      【解决方案7】:

      您可以标记具有成员不可用的属性的属性。有属性只适用于影响序列化的DataContract命名空间中的字段,属性不能适用于字段等。

      诚然,从技术上讲,没有任何东西阻止这些属性用于成员,但它们仅适用于属性。

      【讨论】:

        猜你喜欢
        • 2010-10-18
        • 2017-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-06
        • 2014-03-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多