关于c#:为什么有空的get set属性而不是使用public成员变量?

Why have empty get set properties instead of using a public member variable?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
C#: Public Fields versus Automatic Properties

Duplicate? I think not:
This question is not the same as"Why
use properties instead of public
field". A property with a specified
getter and setter is far different
than a public field. My question was,
is a property WITHOUT a getter and
setter, any different.

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

例子:

1
2
3
4
5
public string MyProperty
{
    get;
    set;
}

对比:

1
public string MyProperty;


一个词:继承。

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

像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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; }
}

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


对于不能对字段执行的属性,可以执行的一项操作是限制setter或getter的可见性:

1
public string MyProperty { get; private set; }

我经常用的东西。

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

1
2
3
4
public interface MyInterface
{
    string MyProperty { get; }
}

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


字段不能在接口中公开。如果需要,可以随时将auto属性更改为"normal"属性,而不需要更改类的签名和接口。

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


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

另外,请记住,您所引用的是自动实现的属性,这会导致编译器为您创建支持字段,而不必为类上的每个属性手动创建支持(私有)字段。


与一个简单的公共领域相比,一个房地产为您提供了几个优势:

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

其思想是管理对象、状态内部的值,通过调用代码避免损坏和误用。


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

诚然,在技术上没有任何东西可以阻止在成员上使用这些属性,但是它们只在属性上工作。