为什么 C# 不允许 const 和 static 在同一行?在 Java 中,您必须将字段声明为“静态”和“最终”以充当常量。为什么 C# 不允许您将 const 声明为 final?
我进一步区分,在 Java 中,每个接口都是公共的和抽象的,无论是否明确声明。const 本质上不是静态的吗?为什么 C# 对此犹豫不决?
const和static确实意味着不同的东西,不同的存储机制,不同的初始化。static是读/写的,因此必须为存储分配内存并且必须在运行时初始化。静态可以用文字值或表达式初始化。相反,const是不可变的,必须使用编译时常量(通常是文字值或可以在编译时完全评估的表达式)进行初始化。该值在编译时是已知的,因此它可以直接嵌入到生成的代码中,因此不需要在运行时分配存储空间。
常量本质上是静态的,所以这将是多余的。
如前所述, Java 中的static final与C#中的static readonly相同。事实上,你是说这个成员是静态的,它的内容是不能改变的。您也可以在这两种情况下指定静态构造函数的值。
但是C# 中的const是完全不同的东西。它更符合 C 中的常量(DEFINE指令),但考虑到了 OOP。它是静态的,因为它是常量——每个实例都有这个具有相同值的常量,没有构造函数可以设置它。也有可能有人想在不必创建实例的情况下访问常量。当您考虑它时,非静态常量是没有意义的。你几乎可以说常量不是对象的一部分——它们只是用它来提供上下文,一个强名称。
Java 没有等价于const。您可以在某处读到static final等同于DEFINE,但这太模糊了。完全不同的机制,没有什么共同点,但最终导致代码的结果是相同的——代码的可维护性和可读性更好。
您只需要停止将 C# 中的常量视为静态成员,因为它们不是。将它们视为DEFINE的 OOP 版本。当您考虑封装时, final和readonly字段的唯一原因是防止您自己的代码意外更改其值。这对我来说听起来并不固定。
总结:
确实,C# const意味着static BUT,C#在关键字readonly中有一个等效于 Java 的final关键字。
所以,事实上,C# 允许const final,它在 C# 中是静态只读的。
因为允许和不要求固有的修饰符会引起混淆。如果你看到
static const int A = 3
const int B = 5
你可能认为它们是两种不同的常数。
即使是 VB 2008(如果您愿意,它可能非常冗长)也不允许这样做。