我总是被告知要封装类中的任何和所有属性...
这是对的:
private string propertyName;
public string PropertyName
{
get { return propertyName; }
set { propertyName = value; }
}
这是错误的
Public string PropertyName;
我看不出哪里需要封装...
第一个代码,对我来说,只是无用的冗余代码......
不需要封装那个字段...
因此,如果有人可以证明在这种情况下进行封装是合理的。
(我可以在其他情况下理解)。
在大多数情况下,公共(public)领域在实践中是可以的。毕竟,如果您稍后需要从外部将其设置为只读,或向其 setter 添加行为,那么您只需将其更改为属性即可。因此,您今天可以将其设置为公共(public)字段,以后需要时再进行更改。对吧?
问题是,在某些情况下您以后无法安全地更改它:
- 如果您使用公共(public)字段编译 Foo.dll,并且有人构建了引用 Foo.dll 的 Bar.dll,您以后不能放入新版本的 Foo.dll,并将该字段更改为属性。您将不得不让其他人针对您的新 Foo.dll 重建 Bar.dll。对于一些商店来说,这不是问题;对于其他人来说,这可能是一个大问题。
- 如果您编写任何反射代码,针对字段的反射与针对属性的反射是非常不同的。因此,如果您稍后将字段更改为属性,您的反射代码就会中断。
这两种情况有多重要?可能不是很。但是抢先式写起来更容易
public string PropertyName { get; set; }
如果您确实以后必须更改它,那么它是为了清理困惑。
而且没有性能成本。 JIT 编译器无论如何都会内联 getter 和 setter。所以它不花钱,却带来一些好处;到那时,为什么不使用属性?