C# 为什么静态类的成员需要声明为静态的?为什么不是';这不是暗示吗?

C# 为什么静态类的成员需要声明为静态的?为什么不是';这不是暗示吗?,c#,.net,static-members,implicit,static-classes,C#,.net,Static Members,Implicit,Static Classes,显然,静态类上不可能有实例成员,因为该类永远无法实例化。为什么我们需要将成员声明为静态的?因为根据定义,它们的所有成员都必须是静态的。他们决定不给一些令人困惑的语法糖。这可能是隐含的,但也会使代码阅读复杂化,并导致混乱。Richard 嗯。。。我猜语言设计师认为最好是非常、非常明确。。。为了避免在不知道代码的维护人员跳入静态类的中间,并假定它们处于“正常”实例上下文中时可能出现的混淆 当然,这只是一个猜测。无论如何,大多数IDE都会通过“自动”添加静态修改器来帮助您。。。或者至少在“编写时”强调

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

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

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

Richard

嗯。。。我猜语言设计师认为最好是非常、非常明确。。。为了避免在不知道代码的维护人员跳入静态类的中间,并假定它们处于“正常”实例上下文中时可能出现的混淆

当然,这只是一个猜测。无论如何,大多数IDE都会通过“自动”添加静态修改器来帮助您。。。或者至少在“编写时”强调你的错误,就像“编译时”一样

这是个好问题。。。不幸的是没有一个“正确”的答案。。。除非有人能打开C语言设计师博客(或类似博客)上讨论这一决定的链接。我能告诉你的是:“我打赌1000美元,这不是意外。”


干杯。基思。

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

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

简单地考虑一下你的情况,禁止这种行为似乎很奇怪。您有一个充满了标记为“static”的方法的类。您决定将类设为静态,这意味着您必须删除所有静态修饰符?真奇怪

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

这使得它成为三个选项中最不坏的选项


有关这类问题的更多想法,请参阅。

显式编码使事情变得可维护

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

通过将成员声明为静态,当您看到代码时,还可以直观地指示代码是什么

它也不那么容易混淆。假设一个类是静态的,其中的成员被标记为静态的,而其他成员没有被标记


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

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

我会更进一步地问:为什么C有静态类?这似乎是一个奇怪的概念,一个奇怪的概念。它只是一个容器,不能用它来键入任何变量、参数或字段。也不能将其用作类型参数。当然,你不可能有这样一个类的实例


我更喜欢模块,比如in和。然后,静态修改器就不必避免混淆了。

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

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

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


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

你刚才不是回答了你自己的问题吗?我相信关于“为什么”唯一的另一个答案是C语言团队没有想到隐式地将静态类的所有成员视为静态。或者他们有意识地决定反对。这真的很重要吗?可能是因为它简化了代码的读取,而代价是迫使程序员添加一个关键字。这样,即使您没有看到类声明,您也将始终知道给定的成员是静态的。类似地,即使你看到了类声明,当人们混合匹配提供它和不提供它时,也不会有混淆。@SirViver:这其实并不重要,但这是一个问题。这就是我把它放在这里的原因。:-)我的问题的重点是,是的,我知道这是语法上的糖,但是为什么他们不考虑这个糖呢。我唯一的想法是,这一次设计师更喜欢“可读性”而不是“简洁性”。另请参见我知道的相关问题,但在整个C#语言中都存在令人困惑的语法糖分。事实上,他们一直在增加。我无法理解为什么他们忽略了这一点。要清楚地表明,所有这些元素都是静态的。如果不将某个东西声明为静态,但它是静态的,那将非常混乱。无法对语言的其余部分进行评论。我必须说,他们做出了一个很好的决定,明确声明成员是静态的。考虑一下.NET4.0var,很容易