25

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

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

4

5 回答 5

41

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

于 2009-05-09T04:24:18.793 回答
23

常量本质上是静态的,所以这将是多余的。

于 2009-05-09T03:54:48.037 回答
10

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

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

Java 没有等价于const。您可以在某处读到static final等同于DEFINE,但这太模糊了。完全不同的机制,没有什么共同点,但最终导致代码的结果是相同的——代码的可维护性和可读性更好。

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

总结:

  • 最终 = 只读
  • 静态最终 = 静态只读
  • 不适用 = 常量
于 2010-04-15T20:48:59.677 回答
3

确实,C# const意味着static BUT,C#在关键字readonly中有一个等效于 Java 的final关键字。

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

于 2009-05-09T04:54:48.907 回答
2

因为允许和不要求固有的修饰符会引起混淆。如果你看到

static const int A = 3
const int B = 5

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

于 2009-05-09T04:10:09.170 回答