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

时间:2009-05-09 03:51:22

标签: c# java const constants final

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

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

5 个答案:

答案 0 :(得分:41)

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

答案 1 :(得分:22)

其性质的常量是静态的,因此这将是多余的。

答案 2 :(得分:9)

如前所述,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 = const

答案 3 :(得分:3)

C# const implies static BUT,C#确实与关键字readonly中的Java final 关键字相同。

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

答案 4 :(得分:2)

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

static const int A = 3
const int B = 5

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