是否建议将基类的成员变量设置为受保护,以便子类可以访问这些变量?还是更推荐将成员变量设置为私有,让子类通过getter和setter获取或设置变量?
如果推荐使用getter和setter方法,什么时候使用protected变量?
这与这个问题非常相似,关于是通过属性还是直接访问来访问同一类中的信息。可能也值得阅读所有这些答案。
就个人而言,我不喜欢任何字段都是非私有的,除了具有不可变值(无论是否为 const)的静态只读字段偶尔例外。对我来说,属性只是提供了更好的封装程度。如何存储数据是实现决策,而不是API决策(与属性不同)。为什么派生自类 Bar 的类 Foo 应该关心类 Bar 的实现?
简而言之,我总是选择属性,除了一次性测试代码之外,我不使用受保护的变量。
借助 C# 3.0 中自动实现的属性,将字段转换为属性比以往任何时候都容易。没有什么理由不这样做。
其他程序集中的类可以派生自您的未密封类,并且可以访问受保护的字段。如果有一天您决定将这些字段设置为属性,则其他程序集中的这些类将需要重新编译才能与您的程序集的新版本一起使用。这被称为“破坏二进制兼容性”,这可能是您永远不应该在程序集之外公开字段的一个可靠原因。
这是一个权衡。Setter 和 getter 比直接访问字段要慢一些,所以如果你正在做大量的数学运算并且在你的子类中读/写这些字段很多,你应该直接访问这些字段。但这更像是一个例外。
通常,您应该将它们标记为私有并使用 getter/setter。
所以我的回答是:直接访问频繁使用的字段,否则是 getter/setter。使用常识。
编辑:我做了一些分析,显然即使在发布模式下,字段和属性之间的速度差异也可能高达 20%。在这里查看我的测试用例:http: //pastebin.com/m5a4d1597
我必须同意乔恩的观点。
但是,在某些情况下,我有时将受保护的变量用于“最顶级”的继承类。例如,如果您有一个只读对象并且您无法将其设置回来但您可以在子类中使用它,我不明白为什么我应该拥有一个受保护的 Get 来访问该变量。一个简单的受保护变量执行相同的封装,因为您无法设置此变量并且只能从子类访问此变量。
但是设置/获取是其他情况的方法。