c#使用基类的setter或getter

时间:2008-12-12 13:24:07

标签: c# variables member protected

是否建议将基类的成员变量设置为protected,以便子类可以访问这些变量?或者是否更建议将成员变量设置为private并让子类通过getter和setter获取或设置变量?

如果建议使用getter和setters方法,何时使用受保护的变量?

4 个答案:

答案 0 :(得分:14)

这与this question类似,关于是否通过属性或直接访问访问同一类中的信息。这也许值得阅读所有这些答案。

就个人而言,我不喜欢任何字段都是非私有的,偶尔会出现具有不可变值的静态只读字段(无论是否为const)。对我而言,属性只是提供更好的封装程度。数据的存储方式是实现决策,而不是 API 决策(与属性不同)。为什么类Foo从类Bar中得到关于类Bar的实现的文章?

简而言之,我总是选择属性,除了一次性测试代码之外,我不会使用受保护的变量。

使用C#3.0中自动实现的属性,将字段转换为属性比以往更容易。没有什么理由这样做。

答案 1 :(得分:2)

其他程序集中的类可以从未密封的类派生,并可以访问受保护的字段。如果有一天您决定将这些字段设置为属性,则需要重新编译其他程序集中的那些类以使用新版本的程序集。这被称为“打破二进制兼容性”,也许是你不应该在程序集之外公开字段的一个坚实原因。

答案 2 :(得分:0)

这是一个权衡。 Setter和getter比直接访问字段慢一些,所以如果你在子类中进行大量的数学运算和读/写这些字段,你应该直接访问字段。但这更像是一个例外。

通常情况下,你应该将它们标记为私有,然后选择getter / setter。

所以我的答案是:直接访问频繁使用的字段,否则为getter / setter。使用常识。

编辑:我做了一些分析,显然甚至在发布模式下,字段和属性之间的速度差异可达20%。请在此处查看我的测试用例:http://pastebin.com/m5a4d1597

答案 3 :(得分:0)

我必须同意Jon。

但是,在某些情况下,我会在某些时候使用受保护变量作为“最顶层”的继承类。例如,如果你有一个readonly对象并且你不能将它设置回来但是你可以在子类中使用它,我不明白为什么我应该有一个受保护的Get来访问该变量。一个简单的受保护变量执行相同的封装,因为您无法设置此变量,并且只能从子类访问此变量。

但是set / get是其他情况的方法。