可能重复:
C#: Public Fields versus Automatic Properties重复?我想不是:
这个问题不与“为什么”相同 使用属性而不是公共 字段“。具有指定的属性 吸气剂和二传手差别很大 而不是公共领域。我的问题是, 是一个属性没有一个吸气剂和 二传手,任何不同。
由于最近有空的getter和setter的能力,使用它们而不仅仅是声明一个公共成员变量有什么好处?
示例:
public string MyProperty
{
get;
set;
}
与
public string MyProperty;
答案 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)
与简单的公共领域相比,财产具有以下几个优势:
答案 4 :(得分:5)
想到了紧耦合。使用公共字段会删除使用属性提供的抽象层。使用私有字段和属性可以隐藏其他类的实现,并在需要进行更改时帮助隔离它们(外部类)。
另外,请记住,您指的是auto-implemented properties,这会导致编译器为您创建支持字段,而不必为您的类中的每个属性手动创建支持(私有)字段。 / p>
答案 5 :(得分:1)
我们的想法是通过调用代码来管理对象内部的值,状态,避免损坏和滥用。
答案 6 :(得分:0)
您可以使用成员上不可用的属性标记属性。有些属性仅适用于影响序列化的DataContract命名空间中的字段,该属性不能应用于字段等。
不可否认,没有任何技术上可以防止这些属性被用于成员,但是它们只能用于属性。