c#使用基类的setter或getter

c#使用基类的setter或getter,c#,variables,member,protected,C#,Variables,Member,Protected,是否建议将基类的成员变量设置为protected,以便子类可以访问这些变量?还是更建议将成员变量设置为private,让子类通过getter和setter获取或设置变量 如果建议使用getter和setter方法,那么什么时候使用受保护的变量?这与通过属性还是直接访问同一类中的信息非常相似。这些答案可能也值得一读 就我个人而言,我不喜欢任何字段都是非私有的,偶尔会有例外,静态只读字段具有不可变的值(无论是否为常量)。对我来说,属性只是提供了更好的封装程度。如何存储数据是一个实现决策,而不是API

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

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

这与通过属性还是直接访问同一类中的信息非常相似。这些答案可能也值得一读

就我个人而言,我不喜欢任何字段都是非私有的,偶尔会有例外,静态只读字段具有不可变的值(无论是否为常量)。对我来说,属性只是提供了更好的封装程度。如何存储数据是一个实现决策,而不是API决策(与属性不同)。为什么从类Bar派生的类Foo应该关心类Bar的实现

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


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

这是一种折衷。setter和getter比直接访问字段要慢一些,因此如果您正在做大量的数学运算,并且在子类中大量读取/写入这些字段,那么您应该直接访问字段。但这更像是一个例外

通常,您应该将它们标记为private,然后选择getter/setter

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


编辑:我做了一些分析,很明显,即使在发布模式下,字段和属性之间的速度差异也可能高达20%。请参见此处的测试用例:

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

我必须同意Jon的观点

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


但是,对于其他情况,set/get是一种方法。

如果属性中没有逻辑,那么在发布模式下,JIT无论如何都会内联属性访问,因此不会有任何性能影响;不存在直接(微不足道)属性的性能惩罚;在一些测试中,它实际上变得更快,但我怀疑是宇宙射线干扰了测试-我已经尝试过你的测试(使用秒表和10倍的迭代来获得更好的计时)。我没有看到20%的差异,但我确实看到了~5%的变化,这让我感到惊讶。格雷格:我认为这个测试基本上是合理的。仅仅因为有加速的方法并不意味着它就没有什么有趣的意义。不管怎样,编译器都应该能够内联属性。我尝试将字段设置为私有,但属性没有加快速度。(我还没有尝试密封该类。这当然很有趣。我目前正在尝试int而不是double。)它没有相同的封装-它指定现在和永远,数据将存储在具有该名称的字段中。对实施决策的任何更改都是一个突破性的更改。通常情况下,接受这一点是可以的,但我不愿意:)是的,这同样适用于获得者的名字;)我宁愿不这样做,但我认为在某些情况下这样做并没有那么邪恶;)但是,我认为getter的名称是API的一部分,而存储的选择是一个实现问题。