我已经了解了常量和静态只读字段。我们有一些类只包含常量值。它们用于我们系统中的各种事情。所以我想知道我的观察是否正确:
对于所有公开的内容,这些常量值是否总是静态只读的?并且只对内部/受保护/私有值使用const?
你有什么建议?我甚至应该不使用静态只读字段,而应该使用财产吗?
我已经了解了常量和静态只读字段。我们有一些类只包含常量值。它们用于我们系统中的各种事情。所以我想知道我的观察是否正确:
对于所有公开的内容,这些常量值是否总是静态只读的?并且只对内部/受保护/私有值使用const?
你有什么建议?我甚至应该不使用静态只读字段,而应该使用财产吗?
当前回答
需要注意的几个相关事项:
常量int a
必须初始化。初始化必须在编译时进行。
只读int a
可以使用默认值,而无需初始化。初始化可以在运行时完成(编辑:仅在构造函数内)。
其他回答
如果Consumer位于不同的程序集中,我将使用静态只读。将const和Consumer放在两个不同的集合中是一个很好的方法来击中自己的脚。
公共静态只读字段有点不寻常;公共静态财产(只有一个get)将更常见(可能由私有静态只读字段支持)。
常量值直接写入调用站点;这是双面的:
如果值是在运行时获取的,可能是从config获取的如果更改常量的值,则需要重建所有客户端但它可以更快,因为它避免了方法调用。。。…有时JIT可能会内联
如果该值永远不会改变,那么常量是好的-零等是合理的常量;p除此之外,静态财产更常见。
readonly关键字与const关键字不同。常量字段只能在字段声明处初始化。只读字段可以在声明或构造函数中初始化。因此,只读字段可以具有不同的值,具体取决于所使用的构造函数。此外,虽然const字段是编译时常量,但只读字段可以用于运行时常量
从这个简短而清晰的MSDN参考中。
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。如果是速度,则使用静态只读。