静态只读 vs. 常量

1583

我了解了 const static readonly 字段。我们有一些仅包含常量值的类。它们在系统中用于各种目的。所以我想知道我的观察是否正确:

对于所有公共内容,这种类型的常量值是否应始终是 static readonly ?而仅对 internal / protected / private 值使用 const

您有什么建议?甚至我也不应该使用 static readonly 字段,而应该使用属性吗?


7
我找到了一个非常有趣的例子,支持使用 static readonly尝试在 IEnumerator 中使用 const 会触发无法到达的 yield,导致编译器出现可怕的“内部编译器错误”。虽然我没有在 Unity3D 之外测试过这段代码,但我相信这是 mono.NET问题。然而,这仍然是一个关于 c# 的问题。 - cregox
4
可能是 const 和 readonly 有什么区别? 的重复问题。 - nawfal
10
另一个不同之处在于,您可以在 switch 语句中使用 const 字符串,但不能使用 static readonly 字符串。 - flagg19
9
switch-case语句中,不能使用static readonly作为case变量,需要使用const来替代。翻译后的内容保持原意,通俗易懂,无解释,无额外内容返回。 - Mostafiz Rahman
4
static readonly 不能用作属性参数。 - Dread Boy
有关详细信息,请访问 https://enlear.academy/const-vs-readonly-vs-static-readonly-in-c-755c20aa0b57 - Trident
22个回答

0

Const、readonly、static readonly - 这些关键字执行类似的操作,但有一个重要的区别:

Const - 是一个变量,其值在编译时被赋为常量。您必须为其分配一个值。默认常量是静态的,我们不能在整个程序中更改const变量的值。

Readonly - 表示一个可以在运行时更改或在运行时分配的值,但只能通过非静态构造函数进行分配。

Static readonly - 值可以在运行时分配或在编译时分配并在运行时更改。但是此变量的值只能在静态构造函数中更改。并且不能进一步更改。它只能在执行期间更改一次。

您可以在这里找到示例 - https://www.c-sharpcorner.com/UploadFile/c210df/difference-between-const-readonly-and-static-readonly-in-C-Sharp/


0

有一个重要的问题,在上面的答案中没有提到,应该驱使您更喜欢使用“const”,特别是对于基本类型如“int”,“string”等。

常量可以用作属性参数,而静态只读字段则不行!

Azure函数HttpTrigger,在属性中不使用HttpMethods类

如果微软仅使用常量来表示Http的GET、POST、DELETE等操作。

那么就可以编写:

[HttpTrigger(AuthorizationLeve.Anonymous,  HttpMethods.Get)] // COMPILE ERROR: static readonly, 

但是我不得不求助于

[HttpTrigger(AuthorizationLeve.Anonymous,  "GET")] // STRING

或者使用我的常量:

public class HttpConstants
{
    public const string Get = "GET";
}

[HttpTrigger(AuthorizationLeve.Anonymous,  HttpConstants.Get)] // Compile FINE!

虽然我不确定这是否特别“重要”。但对于给定的示例,我只会写“GET”,因为它更短,而且不太可能发生变化。 ‍♂️ - Svish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接