显然,静态类上不能有实例成员,因为该类永远不会被实例化。为什么我们需要将成员声明为静态的?
8 回答
我经常被问到这样的问题。基本上,问题归结为“什么时候可以由编译器推断出关于声明成员的事实,该事实的显式声明应该是 (1) 必需的、(2) 可选的还是 (3) 禁止的?”
没有一个简单的答案。每一个都必须根据具体情况采取。需要将“静态”放在静态类的成员上。将“新”放在派生类的隐藏、非覆盖方法上是可选的。禁止将“静态”放在 const 上。
简要考虑您的情况,将其禁止似乎很奇怪。你有一整类标记为“静态”的方法。您决定将类设为静态,这意味着您必须删除所有静态修饰符?这很奇怪。
让它成为可选项似乎很奇怪。假设你有一个静态类和两个方法,一个标记为静态,一个没有。由于静态通常不是默认设置,因此认为它们之间存在差异似乎很自然。使其成为可选似乎可能会造成混淆。
这使得它成为必需的,作为三个选项中最不坏的一个。
有关此类问题的更多想法,请参阅http://blogs.msdn.com/b/ericlippert/archive/2010/06/10/don-t-repeat-yourself-consts-are-already-static.aspx 。
因为根据定义,它们的所有成员都必须是静态的。他们决定不给出一些令人困惑的语法糖。
它可能是隐含的,但也会使代码阅读复杂化并导致混淆。
理查德,
嗯...我猜语言设计者认为最好非常非常明确...以避免当不知道代码的维护者跳到中间时出现任何可能的混乱静态类,并假定它们处于“正常”实例上下文中。
但当然,这只是一个猜测。无论如何,大多数IDE都会通过“自动”添加静态修饰符来帮助您......或者至少在“写入时间”突出您的错误,与“编译时间”相对应。
这是一个很好的问题......不幸的是,没有一个“正确”的答案......除非有人可以从 C#-language-designers 博客(或类似的博客)中找到一个讨论这个决定的链接。我可以告诉你的是:“我赌 1,000 美元,这绝非偶然。”
干杯。基思。
我会更进一步,问:为什么 C# 有静态类?这似乎是一个奇怪的概念,一个实际上不是一个类的类。它只是一个容器,你不能用它来输入任何变量、参数或字段。您也不能将其用作类型参数。当然,你永远不可能拥有这样一个类的实例。
我认为明确声明它是静态变量很重要的一个原因是,在多线程编程模型中,这些静态变量由多个线程共享。在进行代码审查或代码分析时,通过读取变量来了解这一重要性要容易得多,而不是查找类声明,并确定变量是静态的还是非静态的。如果您不知道该类是静态的还是非静态的,那么在代码审查期间读取变量时会变得非常混乱。
显式编码使事物可维护
如果我想将一个方法从一个类复制到另一个类,以便更好地组织代码,那么我将不得不一直检查很多东西,以防目标类是静态的还是非静态的。
通过将成员声明为静态成员,您还可以在看到代码时直观地指示代码是什么。
它也不那么令人困惑。想象一个静态类,在它里面有成员被标记为静态,而其他成员没有被标记。
我可以看到很多原因,还有很多其他的原因。
这是因为复制粘贴会更复杂。
如果将方法从静态类复制到非静态类,则必须添加static
关键字。
如果将方法从非静态类复制到静态类,则必须删除static
关键字。
移动方法是开发人员要做的主要事情(“我需要重构这段代码,至少需要一周时间”),通过简化 Eric 和他的团队,我们可以节省数小时的工作时间。