我很高兴C#不允许您访问静态成员,就像'他们是实例成员一样。这避免了Java中常见的错误:
Thread t = new Thread(..);
t.sleep(..); //Probably doesn't do what the programmer intended.
另一方面, 允许您通过'派生类型访问静态成员。除了运算符(它可以让你免于编写演员表),我想不出任何实际上有用的情况。事实上,它积极鼓励诸如以下的错误:
// 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);
当我通过不熟悉的API搜索时,我个人一直反复犯下类似的错误(我记得从表达树开始;我在编辑器中点击BinaryExpression.
并想知道为什么地球上的IntelliSense提供给我MakeUnary
作为选项)。
在我的(短视)意见中,此功能:
(IMO,运营商是一个特殊情况,值得他们自己讨论。)
鉴于C#通常是“成功的一块”语言,为什么这个功能存在?我看不出它的好处(除了'可发现性',它总是可以在IDE中解决),但我看到很多问题。
答案 0 :(得分:8)
我同意这是一种错误。我不知道Stack Overflow上有人发布了以下代码:
ASCIIEncoding.ASCII
等......虽然在执行方面无害,但在阅读代码时会产生误导。
显然现在删除这个“功能”已经太晚了,虽然我猜C#团队可以为这个和其他风格问题引入一个超级详细的警告模式。
也许C#的继任者会改进......
答案 1 :(得分:2)
这在WinForms中很有用。
在任何控件或表单中,您都可以撰写MousePosition
,MouseButtons
或ModifierKeys
来使用从static
继承的Control
成员。
这是否是一个好的决定仍然存在争议。