为什么静态类的成员需要声明为静态?为什么不是隐含的?

时间:2011-05-14 22:12:09

标签: c# .net static-members implicit static-classes

显然,静态类上不能有实例成员,因为该类永远不会被实例化。为什么我们需要将成员声明为静态?

8 个答案:

答案 0 :(得分:44)

我一直被问到这样的问题。基本上这个问题归结为“当一个关于声明成员的事实可以由编译器推断出来时,该事实的明确声明是否需要(1),(2)是可选的,还是(3)禁止的?”

没有一个简单的答案。每个人都必须根据具体情况进行。将“static”放在静态类的成员上是必需的。将“new”放在派生类的隐藏,非重写方法上是可选的。禁止在const上加“static”。

简单地考虑一下你的情景,让它被禁止似乎很奇怪。你有一整个类标有“静态”的方法。您决定使类静态,这意味着您必须删除所有静态修饰符?那真是怪了。

让它成为可选的似乎很奇怪;假设你有一个静态类和两个方法,一个标记为静态,一个不标记。由于静态通常不是默认值,因此很自然地认为它们之间存在差异。使其成为可选项似乎可能令人困惑。

这使得它成为必需,这是三个选项中最不好的。

有关这些问题的更多信息,请参阅http://blogs.msdn.com/b/ericlippert/archive/2010/06/10/don-t-repeat-yourself-consts-are-already-static.aspx

答案 1 :(得分:5)

因为根据定义,他们的所有成员都必须是静态的。他们决定不给出一些令人困惑的句法糖。

答案 2 :(得分:2)

这可能是隐含的,但也会使代码阅读复杂化并导致混淆。

答案 3 :(得分:2)

理查德,

嗯......我猜测语言设计师认为最好是非常非常明确地避免任何可能的混淆当维护者,谁不知道代码,跳转到静态类的中间,并假设它们处于“正常”实例上下文中。

但当然,这只是猜测。无论如何,大多数IDE都会帮助你,通过“自动”添加静态修饰符...或者至少在“写入时间”突出显示你的错误,就像“编译时间”一样。

这是一个很好的问题......不幸的是,没有一个有“正确”答案的人......除非有人能够从C# - 语言设计师博客(或类似的)讨论这个决定。我可以告诉你的是:“我打赌1000美元,这不是偶然的。”

干杯。基思。

答案 4 :(得分:2)

我会更进一步问:为什么C#会有静态类?这似乎是一个奇怪的概念,class that's not really a class。它只是一个容器,你不能用它来输入任何变量,参数或字段。您也不能将它用作类型参数。当然,你永远不会有这样一个类的实例。

我宁愿拥有模块,例如VB.NETF#。然后,静态修饰符对于避免混淆是不必要的。

答案 5 :(得分:1)

显式编码使事情可维护

如果我想将一个方法从一个类复制到另一个类,以便代码组织得更好,那么我将不得不一直在检查很多东西,以防目标类是静态的还是非静态的。

通过将成员声明为静态,您还可以直观地看到代码的内容。

也不那么令人困惑。想象一个静态的类,其内部的成员标记为静态,其他标记为静态。

我可以看到很多原因,还有很多其他原因。

答案 6 :(得分:1)

我认为明确声明它是静态的一个重要原因是因为在多线程编程模型中,这些静态变量由多个线程共享。在进行代码检查或代码分析时,通过读取变量而不是查找类声明来确定变量是静态还是非静态变得容易得多。如果您不知道该类是静态的还是非静态的,那么在代码审查期间读取变量时会非常混乱。

答案 7 :(得分:0)

这是因为复制粘贴会更复杂。

如果将方法从静态类复制到非静态类,则必须添加static关键字。

如果将方法从非静态类复制到静态类,则必须删除static关键字。

移动方法是开发人员做的主要事情(“我需要重构此代码,至少需要一周时间”),并且通过简化Eric和他的团队让我们节省了数小时的工作量。