为什么通过继承类型访问静态成员是有用的?

Ani*_*Ani 18 c# inheritance static language-design

我很高兴C#不允许你访问静态成员,就像'他们是实例成员一样.这避免了Java中的常见错误:

Thread t = new Thread(..);
t.sleep(..); //Probably doesn't do what the programmer intended.
Run Code Online (Sandbox Code Playgroud)

在另一方面,它不会让你访问"到"派生类型的静态成员.除了运算符(它可以让你免于编写演员表),我无法想到任何实际上有用的情况.事实上,它积极鼓励错误,例如:

// Nasty surprises ahead - won't throw; does something unintended:
// Creates a HttpWebRequest instead.
var ftpRequest = FtpWebRequest.Create(@"http://www.stackoverflow.com");

// Something seriously wrong here.
var areRefEqual = Dictionary<string, int>.ReferenceEquals(dict1, dict2);
Run Code Online (Sandbox Code Playgroud)

我个人保持了承诺,当我通过陌生的API搜索我的方式过类似的错误(我记得开始了与表达式目录树,我打BinaryExpression.在编辑器中,并想知道为什么地球上的智能感知人给我MakeUnary作为一个选项).

在我的(短视)意见中,此功能:

  1. 不减少冗长; 程序员必须以某种方式指定类型名称(当访问当前类型的继承静态成员时,不包括运算符和大小写).
  2. 鼓励上面提到的错误/误导性代码.
  3. 可以向程序员建议C#中的静态方法表现出某种"多态性",而不是.
  4. (次要)在重新编译时引入'沉默',可能是无意的重新绑定可能性.

(国际海事组织,运营商是一个特殊情况,值得他们自己讨论.)

鉴于C#通常是"成功的一块"语言,为什么这个功能存在?我看不到它的好处(除了'可发现',它总是可以在IDE中解决),但我看到很多问题.

Jon*_*eet 8

我同意这是一个错误.我不知道Stack Overflow上有人发布了以下代码:

ASCIIEncoding.ASCII
Run Code Online (Sandbox Code Playgroud)

等......虽然在执行方面无害,但在阅读代码方面却有误导性.

显然现在删除这个"功能"为时已晚,尽管我认为C#团队可以为这个和其他样式问题引入一个超级详细的警告模式.

也许C#的继任者将改善事物......

  • ReSharper肯定警告过这个......"通过派生类型访问类型的静态成员".Yey! (4认同)
  • 就像@SLaks所说,"UTF8Encoding.ASCII"更糟糕 (3认同)