我已经了解了常量和静态只读字段。我们有一些类只包含常量值。它们用于我们系统中的各种事情。所以我想知道我的观察是否正确:
对于所有公开的内容,这些常量值是否总是静态只读的?并且只对内部/受保护/私有值使用const?
你有什么建议?我甚至应该不使用静态只读字段,而应该使用财产吗?
我已经了解了常量和静态只读字段。我们有一些类只包含常量值。它们用于我们系统中的各种事情。所以我想知道我的观察是否正确:
对于所有公开的内容,这些常量值是否总是静态只读的?并且只对内部/受保护/私有值使用const?
你有什么建议?我甚至应该不使用静态只读字段,而应该使用财产吗?
当前回答
另外一个我不相信的区别是上面提到的:
常量和静态只读值不会在Visual Studio IDE中应用CodeLens。
static只获取财产,但会将CodeLens应用于这些属性。
我认为添加CodeLens非常有价值。
注意:当前正在使用Visual Studio 2022。
其他回答
Const:Const只是“常量”,它的值是常量,但在编译时是常量。并且必须为其赋值。默认情况下,常量是静态的,我们不能在整个程序中更改常量变量的值。静态只读:静态只读类型变量的值可以在运行时赋值,也可以在编译时赋值,并在运行时更改。但该变量的值只能在静态构造函数中更改。并且不能进一步改变。它只能在运行时更改一次
参考:c-sharpcorner
我的偏好是尽可能使用const,正如前面的回答中所提到的,它仅限于字面表达或不需要求值的内容。
如果我碰到了这个限制,那么我会回退到静态只读,但有一个警告。我通常会使用带有getter和支持私有静态只读字段的公共静态属性,正如Marc在这里提到的。
C#.Net中的常量和静态只读字段之间有一个微小的区别
const必须在编译时用值初始化。
const在默认情况下是静态的,需要用常量值初始化,以后不能修改。它不能与所有数据类型一起使用。对于ex-DateTime。它不能与DateTime数据类型一起使用。
public const DateTime dt = DateTime.Today; //throws compilation error
public const string Name = string.Empty; //throws compilation error
public static readonly string Name = string.Empty; //No error, legal
只读可以声明为静态,但不是必需的。无需在声明时进行初始化。它的值可以使用构造函数赋值或更改一次。所以,有可能更改只读字段的值一次(不管它是静态的还是非静态的),这在const中是不可能的。
施工
只能应用于字段。值应在代码编译时。适合在编译代码之前就已经知道的代码中删除神奇的“字符串”、“int/double”、(原始类型)等。编译后,该值将被放置在编译代码的所有使用常量的地方。所以,如果你在很多地方使用了一个巨大的字符串,那么在使它成为常量之前要小心。考虑使用静态只读。
静态只读
静态只读应用于字段/道具,静态可用于方法。(附带说明)当静态应用于方法时,编译的代码不会将“this”参数传递给方法,因此您无法访问对象的实例数据。适用于编译代码后可能更改的值。类似于在应用程序启动等过程中从配置初始化的值。编译代码后,在IL代码中使用ref to值,与使用const相比可能会慢一些,但编译的代码很小
在重构过程中,所有常量都可以安全地转换为静态只读,但反之亦然,正如我们前面所看到的,当一些静态只读变量可以在构造函数中初始化时,转换后的代码可能会中断。
常量就像名称所暗示的那样,字段不会改变,通常在编译时在代码中静态定义。
只读变量是可以在特定条件下更改的字段。
它们可以在第一次像常量一样声明时初始化,但通常在构造函数内的对象构造期间初始化。
在上述条件下,初始化发生后不能更改它们。
静态只读对我来说听起来是一个糟糕的选择,因为如果它是静态的,并且它永远不会改变,那么就使用它public const。如果它可以改变,那么它不是常量,然后根据您的需要,您可以使用只读变量,也可以仅使用常规变量。
另外,另一个重要区别是常量属于类,而只读变量属于实例!