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

时间:2009-03-18 21:13:33

标签: c# static resharper

使用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
    }
}

当通过B使用A的静态成员时,是否有人知道有哪些问题(如果有的话)?

4 个答案:

答案 0 :(得分:84)

可能误导的一个地方是静电是工厂方法,例如WebRequest类有一个工厂方法Create,如果通过派生类访问,它将允许编写这种类型的代码。

var request = (FtpWebRequest)HttpWebRequest.Create("ftp://ftp.example.com");

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

var request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com");

最终,通过派生类型访问静态没有什么大问题,但代码通常更清楚,不这样做。

答案 1 :(得分:30)

B.SomethingStatic()声明SomethingStaticB的成员。这不是真的。 SomethingStatic明确地是A的成员。它是B成员无法获得资格的事实(好像它是B的成员)是一个方便的问题。在使用B进行限定时可以访问的事实是,IMO,这是一个错误。

答案 2 :(得分:15)

这不是一个警告,通常只是一个建议。你正在不必要地创造对某事物的依赖。

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

答案 3 :(得分:2)

是的我也看过这个,我一直认为这只是警告我,因为这是不必要的。 A.SomethingStatic();会做同样的事情。