为什么静态类的成员需要声明为静态的? 为什么不是隐含的?
很明显,在静态类上不能有一个实例成员,因为这个类永远不能被实例化。 为什么我们需要声明成员是静态的?
我总是被问到这样的问题。 基本上,这个问题归结为:“如果一个被声明的成员的事实可以被编译器推断出来,如果这个事实的明确声明是(1)必需的,(2)可选的,或(3)被禁止的?
没有一个简单的答案。 每一个都必须在个案的基础上采取。 将“静态”放在静态类的成员上是必需的。 将“新”置于隐藏的派生类的非重写方法是可选的。 把“静态”放在一个const是禁止的。
简单地考虑一下你的情况,把它禁止似乎是奇怪的。 你有一整个课程充满了标记为“静态”的方法。 你决定让类是静态的,这意味着你必须删除所有的静态修饰符? 这很奇怪。
使之成为可选项似乎是件奇怪的事情。 假设你有一个静态类和两个方法,一个标记为静态,一个不是。 由于静态通常不是默认的,所以认为它们之间存在差异似乎是自然而然的。 使其成为可选的似乎是可能混淆的。
这使得它成为必需的,这是三个选项中最不好的一个。
因为根据定义,所有的成员必须是静态的。 他们决定不给一些混乱的语法糖。
这可能是隐含的,但也会使代码阅读复杂化并导致混淆。
理查德,
嗯…我想,语言devise者决定,如果一个维护者不知道代码跳到一个中间,那么最好是非常明确地避免任何可能的混淆。静态类,并假定它们处于“正常”实例上下文中。
当然,这只是一个猜测。 大多数IDE都可以通过“自动地”添加静态修饰符来帮助您,或者至less在“编写时间”时突出显示您的错误,就像“编译时间”一样。
这是一个很好的问题……不幸的是没有一个“正确的”答案,除非有人能够从C#语言devise师博客(或类似的)讨论这个决定。 我可以告诉你的是:“我敢打赌1000美元,这不是偶然的。”
干杯。 基思。
我会更进一步,问:为什么C#有静态类呢? 这似乎是一个奇怪的概念,一个class级,不是一个真正的class级 。 这只是一个容器,你不能用它来input任何variables,参数或字段。 你也不能用它作为types参数。 当然,你永远不可能有这样一个类的实例。
我宁愿有模块,就像在VB.NET和F# 。 然后,静态修改器将不是必要的,以避免混淆。
显式编码使事物可维护
如果我想将一个方法从一个类复制到另一个类,那么代码就会更好地组织起来,那么我就不得不不断地检查很多事情,以防目的类是静态的。
通过声明这个成员是静态的,当你看到它的时候,你也可以看到代码是什么。
这也不那么混乱 。 设想一个静态的类,里面有成员标记为静态,其他成员不标记。
我可以看到很多原因,还有很多其他的原因。
我认为明确声明它是静态的一个原因是因为在multithreading编程模型中,这些静态variables由多个线程共享。 在进行代码审查或代码分析时,通过阅读variables来获取这个重要性要容易得多,而不是查找类声明,并确定variables是静态的还是非静态的。 如果您不知道类是静态的还是非静态的,那么在代码复审期间读取variables时可能会感到非常困惑。
这是因为复制粘贴会更复杂。
如果你从一个静态类复制一个方法到一个非静态类,那么你将不得不添加static
关键字。
如果您将方法从非静态类复制到静态类,则必须删除static
关键字。
移动方法是开发人员所做的主要工作(“我需要重构这些代码,至less需要一周的时间”),让Eric和他的团队更容易让我们节省数小时的工作时间。