Why have empty get set properties instead of using a public member variable?
Possible Duplicate:
C#: Public Fields versus Automatic PropertiesDuplicate? 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。完全取决于实现类来决定它们应该如何设置
字段不能在接口中公开。如果需要,可以随时将auto属性更改为"normal"属性,而不需要更改类的签名和接口。
通常,字段被视为实现细节,在未来的代码版本中可能会发生更改。因此,您应该通过方法和属性公开数据,为将来不影响使用类的代码的内部更改留出空间。
我想到了紧耦合。使用公共字段将删除使用属性所提供的抽象层。使用私有字段和属性可以隐藏实现与其他类的关系,并有助于在需要更改时隔离它们(外部类)。
另外,请记住,您所引用的是自动实现的属性,这会导致编译器为您创建支持字段,而不必为类上的每个属性手动创建支持(私有)字段。
与一个简单的公共领域相比,一个房地产为您提供了几个优势:
- 您可以控制属性是只读、只写还是读/写
- 您可以隐藏实际的实现(可能在setter中,您不只是想设置一个值)
- 使用数据绑定时(例如在ASP.NET中),必须使用属性(不适用于字段)
其思想是管理对象、状态内部的值,通过调用代码避免损坏和误用。
可以用成员上不可用的属性标记属性。有些属性仅适用于影响序列化的DataContract命名空间中的字段,这些属性不能应用于字段等。
诚然,在技术上没有任何东西可以阻止在成员上使用这些属性,但是它们只在属性上工作。