为什么有空的get set属性而不是使用公共成员变量?

时间:2009-12-09 19:23:04

标签: c# properties

  

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

     

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

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

示例:

public string MyProperty
{
    get;
    set;
}

public string MyProperty;

7 个答案:

答案 0 :(得分:43)

一个词:继承。

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

像这样:

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; }
}

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

答案 1 :(得分:27)

使用字段无法处理的属性可以做的一件事是限制setter或getter的可见性:

public string MyProperty { get; private set; }

我经常使用的东西。

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

public interface MyInterface
{
    string MyProperty { get; }
}

请注意,您无需在此处设置setter。完全由实现类来确定它们应如何设置MyProperty

答案 2 :(得分:10)

字段不能在接口中公开。并且如果需要,可以随时将auto-property更改为“normal”属性,而不会更改类的签名和界面。

通常,字段被视为实现细节,在将来的代码版本中可能会更改。因此,您应该通过方法和属性公开数据,为未来的内部更改留出开放的方式,这不会影响使用该类的代码。

答案 3 :(得分:5)

与简单的公共领域相比,财产具有以下几个优势:

  • 您可以控制该属性是只读,只写还是读/写
  • 你可以隐藏实际的实现(可能在setter中你想做的不仅仅是设置一个值)
  • 使用数据绑定时(例如在ASP.NET中),您将不得不使用属性(不适用于字段)

答案 4 :(得分:5)

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

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

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

不可否认,没有任何技术上可以防止这些属性被用于成员,但是它们只能用于属性。