我已经了解了常量和静态只读字段。我们有一些类只包含常量值。它们用于我们系统中的各种事情。所以我想知道我的观察是否正确:
对于所有公开的内容,这些常量值是否总是静态只读的?并且只对内部/受保护/私有值使用const?
你有什么建议?我甚至应该不使用静态只读字段,而应该使用财产吗?
我已经了解了常量和静态只读字段。我们有一些类只包含常量值。它们用于我们系统中的各种事情。所以我想知道我的观察是否正确:
对于所有公开的内容,这些常量值是否总是静态只读的?并且只对内部/受保护/私有值使用const?
你有什么建议?我甚至应该不使用静态只读字段,而应该使用财产吗?
当前回答
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 a
必须初始化。初始化必须在编译时进行。
只读int a
可以使用默认值,而无需初始化。初始化可以在运行时完成(编辑:仅在构造函数内)。
常量(在编译时确定)可用于只读静态不能使用的情况,如在switch语句或属性构造函数中。这是因为只读字段仅在运行时解析,并且某些代码构造需要编译时保证。只读静态可以在构造函数中计算,这通常是一个重要而有用的东西。区别是功能性的,我认为它们的用法也是如此。
在内存分配方面,至少对于字符串(作为引用类型)来说,似乎没有区别,因为两者都是内部的,并且将引用一个内部的实例。
就我个人而言,我的默认值是只读静态的,因为它对我来说更有语义和逻辑意义,尤其是因为大多数值在编译时都不需要。顺便说一句,公共只读静态数据并不罕见,正如标记的答案所示:例如,System.String.Empty就是其中之一。
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中是不可能的。
有一个重要的问题,在上面的答案中没有提到,应该会促使您更喜欢“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!
需要注意的一点是const仅限于基元/值类型(字符串除外)。