c# - 为什么是 "Do not access a static member that is defined in a base class from a derived class."

标签 c# inheritance static

Microsoft 关于 C# Coding Conventions (C# Programming Guide) 的文章明确指出:

"Do not access a static member that is defined in a base class from a derived class."

为什么不应该访问静态成员?

似乎存在应该发生这种情况的有效场景,例如所有 const 成员都是静态的。派生类是否应该永远无法读取基类中定义的常量成员?

最佳答案

让我们以 object.ReferenceEquals 为例。您可以通过以下几种方式从派生类调用此方法:

class A {
 A() {
  ReferenceEquals("a", "b"); //your warning is based on this style
  object.ReferenceEquals("a", "b"); //recommended style
 }
}

ReferenceEquals 可在 A 中访问的事实只是一个巧合。静态方法独立于任何继承层次结构。因此,在任何地方都始终称它为完全合格的。

这个警告只是关于风格和清晰度。我展示的所有变体都编译到相同的 IL。

另一种解释是您滥用继承来缩短用于调用方法的语法。这是对继承的滥用。 ASP.NET MVC 使用 Controller 基类执行此操作。它允许您编写 return View();。它使用继承来方便地使用一组方法。

关于c# - 为什么是 "Do not access a static member that is defined in a base class from a derived class.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23632586/

相关文章:

c# - vstest.console 可以通过提供特征来过滤测试运行吗?

c# - Expression.SwitchCase 匹配问题

javascript - 用C#重写部分javascript

php - 在 PHP 中使用继承将多个子类的数据添加到数组

c# - 使用 C# 的 Metro 风格应用教程

Java不继承访问器方法?

c++ - 当不需要创建多个对象时,是否应该将类的成员变为静态的?

arrays - 如何在 Swift 中创建静态数组?

c++ - 如何在 C++ 中仅实例化一个变量一次?

java - 如何从java中的父对象列表中获取子对象列表