在派生类型上使用类的静态成员?

Swi*_*wim 73 c# resharper static

使用Resharper 4.1,我遇到了这个有趣的警告:"通过派生类型访问类型的静态成员".以下是发生这种情况的代码示例:

class A {
    public static void SomethingStatic() {
       //[do that thing you do...]
    }
}

class B : A {
}

class SampleUsage {
    public static void Usage() {
        B.SomethingStatic(); // <-- Resharper warning occurs here
    }
}
Run Code Online (Sandbox Code Playgroud)

当通过B使用A的静态成员时,有没有人知道有什么问题(如果有的话)?

Gre*_*ech 84

可能误导性的一个地方是静态是工厂方法,例如,WebRequest类具有工厂方法Create,如果通过派生类访问,则允许写入这种类型的代码.

var request = (FtpWebRequest)HttpWebRequest.Create("ftp://ftp.example.com");
Run Code Online (Sandbox Code Playgroud)

request是类型,FtpWebRequest但它令人困惑,因为它看起来像是从HttpWebRequest(兄弟类)创建的,即使该Create方法实际上是在WebRequest(基类)上定义的.以下代码的含义相同,但更清楚:

var request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com");
Run Code Online (Sandbox Code Playgroud)

最终,通过派生类型访问静态没有什么大问题,但是代码通常不清楚.


P D*_*ddy 30

B.SomethingStatic()制作成为的SomethingStatic成员的陈述B.这不是真的. SomethingStatic毫无疑问是其中的一员A.事实上,它的成员不合格B(就像它是其成员一样B)是一个方便的问题.事实上,当它与BIMO 合格时,它是可以访问的,这是一个错误.

  • +1 imo,你的解释是最好的. (2认同)

Dan*_*ker 15

通常,这不是一个警告,只是一个建议.您正在不必要地创建对某些内容的依赖.

假设您稍后决定B不需要继承A.如果您遵循Resharper的建议,您将不需要修改该行代码.

  • 你也会遇到与实例方法相同的问题.通过所有这些逻辑,为什么继承任何东西?还是我错过了什么? (2认同)