我知道这是一个主观问题,但我总是对编码风格的最佳实践感到好奇。在实现类中调用基本方法之前,ReSharper 4.5给出了关键字“base”的警告,即
base.DoCommonBaseBehaviorThing();
虽然我很欣赏“越少越好”的心态,但我也花费了大量时间来调试/维护高度链接的应用程序,并且觉得通过查看成员调用对于基础对象可能会有所帮助在它。当然,改变ReSharper的规则很简单,但你们怎么想?调用基础成员时应该使用“base”吗?
答案 0 :(得分:22)
你应该使用base.MethodCall();
的唯一时间是你在子类中使用相同名称的重写方法,但实际上你想在父类中调用该方法。
对于所有其他情况,只需使用MethodCall();
即可。
像this
和base
这样的关键字不会使代码更具可读性,并且应该避免所有情况,除非它们是必要的 - 例如在我描述的情况下以上。
答案 1 :(得分:17)
我不确定使用这个是不好的做法。 base ,但不是好的或坏的做法,而是语义问题。而这个是多态的,这意味着即使使用它的方法属于基类,它也会使用overriden方法, base 不是。 base 将始终引用调用它的方法的基类定义的方法,因此不是多态的。这是一个巨大的语义差异。然后应该相应地使用 base 。如果您想要那个方法,请使用 base 。如果您希望调用保持多态,请不要使用 base 。
答案 2 :(得分:6)
另一个需要考虑的重点是,虽然您目前尚未覆盖该方法,但这并不意味着您将来不会使用基本的所有呼叫。如果不对所有通话执行查找和替换,您将无法获得新功能。
使用此功能预先调用。除了减少/增加可读性(忽略范围内两个变量具有相同名称的情况)之外,它不会做任何事情。前缀将更改您在许多常见方案中编写的代码的功能。所以我永远不会添加基础。 除非需要。
答案 3 :(得分:4)
我认为通常只有在覆盖以前的功能时才应使用base
。
某些语言(C#没有)也通过它的基类名称显式调用函数来提供此功能,如下所示:Foo.common()
(当然,从Bar
中的某处调用)。
这将允许您在链中向上跳过,或者从多个实现中选择 - 在多重继承的情况下。
无论如何,我觉得只有在需要明确调用父级功能时才应该使用base,因为你已经或已经覆盖了这个类中的那个功能。
答案 4 :(得分:3)
这真的是个人喜好的问题。如果你喜欢看“基地”。在您的成员开头,您可以轻松关闭规则(转到选项>检查严重性>代码冗余>冗余'基数。'限定符)。不要让非行为静态代码分析规则影响您的首选编码风格。
修改强>
要考虑的一件事是FXCop和R#中的静态代码分析可以为所有可能的需求提供规则。实际上同时遵守所有规则是有点繁重的。你应该定义你喜欢的编码风格(如果你在团队中工作,集体做),并坚持下去。修改规则以符合您的编码标准,反之亦然。