为什么C#不允许在同一行上使用const和static?

为什么C#不允许在同一行上使用const和static? 在Java中,您必须将字段声明为“static”和“final”以充当常量。 为什么C#不允许你将const声明为final?

我进一步区分在Java中,每个接口都是公共的和抽象的,无论是否显式声明。 const本质上不是有效的静态吗? 为什么C#对此不以为然?

conststatic确实意味着不同的东西,不同的存储机制,不同的初始化。 static是读/写,因此必须为存储分配内存,并且必须在运行时初始化。 可以使用文字值或表达式初始化静态 。 相反, const是不可变的,必须使用编译时常量 (通常是文字值或可在编译时完全评估的表达式)进行初始化。 该值在编译时是已知的,因此可以直接嵌入到生成的代码中,因此不需要在运行时分配存储。

常量本质上静态的,因此这将是多余的。

如前所述,Java中的static final与C#中的static readonly相同。 实际上,您说这个成员是静态的,其内容无法更改。 您也可以在两种情况下指定静态构造函数的值。

但是C#中的const是完全不同的东西。 它更符合C( DEFINE指令)中的常量,但考虑到OOP。 它是静态的,因为它是常量 – 每个实例都有这个常量具有相同的值,没有构造函数可以设置它。 此外,有人可能无需创建实例即可访问常量。 当你想到它时,非静态常数就没有意义了。 你几乎可以说常量不是对象的一部分 – 它们只是用它来提供上下文,一个强大的名字。

Java没有const的等价物。 你可以在某处读到静态最终版本相当于DEFINE,但那只是模糊不清。 完全不同的机制,没有任何共同点,但最终导致代码相同 – 代码的可维护性和可读性更好。

你只需要停止考虑C#中的常量作为静态成员,因为它们不是。 将它们视为DEFINE的 OOP版本。 当您考虑封装时, 最终只读字段的原因是为了防止您自己的代码意外地更改其值。 这对我来说听起来并不常见。

Sumary:

  • final = readonly
  • static final = static readonly
  • N / A =常数

确实, C# const意味着静态 BUT,C#在关键字readonly中具有Java的final关键字。

所以,实际上,C#允许const final ,它在C#中是静态只读

因为允许并且不需要固有的修饰符会导致混淆。 如果你看到

 static const int A = 3 const int B = 5 

你可能认为它们是两种不同的常数。
即使是VB 2008(如果你愿意,也可能非常冗长)不允许这样做。