繁体   English   中英

c#使用基类的setter或getter

[英]c# using setters or getters from base class

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

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

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

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

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

通过在C#3.0中自动实现的属性,将字段转换为属性比以往更容易。 没有理由去做。

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

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

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

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

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

我必须同意乔恩。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM