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

Cug*_*uga 24 c# java final const constants

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

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

Tim*_*ong 41

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

  • @Steven:const仍然与readonly不同.Readonly引用*reference*,而不是*value*.Readonly只意味着引用必须始终指向同一个对象.这并不意味着对象的价值不能改变.另一方面,Const确实意味着该值是不变的. (4认同)

Gre*_*gle 22

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

  • 总的来说,减少不必要的选择是个好主意,IMO. (10认同)
  • 在字典意义上,常量是静态的,但在C#中静态是指内存分配,而不是值.这是静态的内存分配(一次,对于类的所有实例). (6认同)

Cod*_*per 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 =常数