C# 正在使用;“基础”;即使这可能有利于可读性,但这是一种糟糕的做法?

C# 正在使用;“基础”;即使这可能有利于可读性,但这是一种糟糕的做法?,c#,coding-style,resharper,C#,Coding Style,Resharper,我知道这是一个主观的问题,但我总是对编码风格的最佳实践感到好奇。ReSharper 4.5在实现类中的基方法调用之前给我一个关键字“base”的警告,即 base.DoCommonBaseBehaviorThing(); 虽然我很欣赏“少即是好”的思维方式,但我也花了大量时间调试/维护高度链接的应用程序,并且觉得知道成员调用是对基础对象的调用可能会有所帮助,只需查看它。当然,改变ReSharper的规则很简单,但你们怎么想?调用基本成员时是否应该使用“base”?这是唯一一次应该使用base.

我知道这是一个主观的问题,但我总是对编码风格的最佳实践感到好奇。ReSharper 4.5在实现类中的基方法调用之前给我一个关键字“base”的警告,即

base.DoCommonBaseBehaviorThing();

虽然我很欣赏“少即是好”的思维方式,但我也花了大量时间调试/维护高度链接的应用程序,并且觉得知道成员调用是对基础对象的调用可能会有所帮助,只需查看它。当然,改变ReSharper的规则很简单,但你们怎么想?调用基本成员时是否应该使用“base”?

这是唯一一次应该使用
base.MethodCall()是指在子类中有一个同名的重写方法,但实际上要在父类中调用该方法

对于所有其他情况,只需使用
MethodCall()


this
base
这样的关键字不会使代码更具可读性,除非有必要,否则应避免使用这些关键字,如上文所述的情况

这实际上是个人喜好的问题。如果您喜欢看到“基本”。在成员开头,您可以轻松地关闭规则(转到选项>检查严重性>代码冗余>冗余“基本”。限定符)。不要让非行为静态代码分析规则影响您首选的编码风格

编辑


一个要考虑的是,FXCop和R.Syt中的静态代码分析可以为所有可能的需求提供规则。实际上同时遵守所有规则有点繁琐。你应该定义你喜欢的编码风格(如果你在一个团队中工作,那么集体地去做),并坚持下去。修改规则以匹配编码标准,而不是相反。

我认为通常只有在覆盖以前的功能时才应该使用
base

有些语言(C#不提供)也提供此功能,它通过显式地使用函数的基类名调用函数,如:
Foo.common()
(当然是从
Bar
中的某个地方调用)

这将允许您在链中向上跳过,或者从多个实现中选择—在多重继承的情况下


不管怎样,我觉得base应该只在需要显式调用父类的功能时使用,因为您正在或已经在这个类中重写了该功能。

另一个需要考虑的重要问题是,虽然您当前尚未重写该方法,但这并不意味着您将来将永远不会重写它,并且会将所有这些函数都放在前面你和基地的通话。如果不为所有调用执行查找和替换,您将无法获得新功能


在使用此命令进行呼叫前置时。除了减少/增加可读性(忽略范围中两个变量同名的情况)外,不会执行任何操作。prefix将更改您在许多常见场景中编写的代码的功能。所以,我永远不会添加基础。除非需要。

我真的不确定使用这种方法是否是一种不好的做法。然而,基础不是好的或坏的实践,而是语义的问题。然而,这是多态的,这意味着即使使用它的方法属于基类,它也将使用重写的方法,而base不是。base将始终引用在调用它的方法的基类中定义的方法,因此它不是多态的。这是一个巨大的语义差异。然后应相应地使用基底。如果需要该方法,请使用base。如果希望调用保持多态性,请不要使用base。

“不要使代码更具可读性,应该避免”。。。至少主观标记被设置为“this”的注释。在处理实例和静态方法时,“this”关键字极大地提高了代码的可读性。过度使用base的问题不仅仅是可读性吗?在我看来,这实际上是一个更大意义上的可维护性和可理解性问题。例如,如果到处都有base,则必须在很多地方进行更改,例如,如果您添加了覆盖,因为现在您确实不需要base。编译器不会告诉你有问题。你真的每次都会记住这个吗???这是一个侧重点,但我认为重要的是要强调,
this
应该在*方法需要时避免使用。然而,对于类字段和属性,许多指导原则表明它应该在所有情况下都使用。如果你遵循在私有字段前面加一个下划线的典型惯例,那么使用“this”几乎没有什么好处,因为在任何人关心之后很长一段时间都会有评论你所有的基础都属于usIMHO,这取决于未来的读者(开发者)认为什么是好的可读性。问他们,然后回答你自己的问题:“这取决于谁将维护代码。”我不会说这是编码风格或个人偏好。在某些情况下,对base.SomeMethod()的调用与对SomeMethod()的调用可能会产生相同的效果,但这两个调用可能根本不同。在这种情况下,您是正确的。我指的是静态代码分析将“基”标记为冗余的情况。在您的示例中,它不会被标记。我想添加以下内容:通过不必要地使用base,如果以后重写类中的方法,代码将调用base方法,而不是刚才重写的方法。