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