我了解了 const
和 static readonly
字段。我们有一些仅包含常量值的类。它们在系统中用于各种目的。所以我想知道我的观察是否正确:
对于所有公共内容,这种类型的常量值是否应始终是 static readonly
?而仅对 internal
/ protected
/ private
值使用 const
?
您有什么建议?甚至我也不应该使用 static readonly
字段,而应该使用属性吗?
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/
有一个重要的问题,在上面的答案中没有提到,应该驱使您更喜欢使用“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!
static readonly
:尝试在IEnumerator
中使用const
会触发无法到达的yield
,导致编译器出现可怕的“内部编译器错误”。虽然我没有在 Unity3D 之外测试过这段代码,但我相信这是 mono 或 .NET 的 问题。然而,这仍然是一个关于 c# 的问题。 - cregoxswitch-case
语句中,不能使用static readonly
作为case
变量,需要使用const
来替代。翻译后的内容保持原意,通俗易懂,无解释,无额外内容返回。 - Mostafiz Rahmanstatic readonly
不能用作属性参数。 - Dread Boy