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

Jer*_*emy 31 c# properties

可能重复:
C#:公共字段与自动属性

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

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

例:

public string MyProperty
{
    get;
    set;
}
Run Code Online (Sandbox Code Playgroud)

与:

public string MyProperty;
Run Code Online (Sandbox Code Playgroud)

Web*_*euw 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; }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 公共字段在什么上下文中不是由派生类继承的?还是我误解了你? (6认同)
  • 您可以将它们设置为虚拟并在派生类中覆盖它们. (2认同)

Ron*_*erg 29

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

public string MyProperty { get; private set; }
Run Code Online (Sandbox Code Playgroud)

我用了很多东西.

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

public interface MyInterface
{
    string MyProperty { get; }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 值得指出的是,通过将字段声明为只读字段,您可以做一些非常相似的事情(虽然不是强大的一半),这样做只能在构建时分配. (2认同)

Luc*_*ero 11

字段不能在接口中公开.并且如果需要,可以随时将自动属性更改为"正常"属性,而无需更改类的签名和界面.

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

  • 很好的答案,澄清:将字段更改为属性实际上是一个重大变化,因为它不保留二进制兼容性.一个例子是该类的某些用户可能正在对其进行一些反思,而FieldInfo与PropertyInfo完全不同.其他答案中提到了其他示例. (2认同)

M4N*_*M4N 5

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

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


Wil*_*l P 5

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

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

  • 是.隐藏你的私人! (3认同)