使用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的静态成员时,是否有人知道有哪些问题(如果有的话)?
答案 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()
声明SomethingStatic
是B
的成员。这不是真的。 SomethingStatic
明确地是A
的成员。它是B
成员无法获得资格的事实(好像它是B
的成员)是一个方便的问题。在使用B
进行限定时可以访问的事实是,IMO,这是一个错误。
答案 2 :(得分:15)
这不是一个警告,通常只是一个建议。你正在不必要地创造对某事物的依赖。
假设您稍后决定B不需要继承A.如果您遵循Resharper的建议,则无需修改该行代码。
答案 3 :(得分:2)
是的我也看过这个,我一直认为这只是警告我,因为这是不必要的。 A.SomethingStatic();
会做同样的事情。