我有一些“常量”的初始化属性/字段,我想知道以下哪一行最适合使用:
public static Color MyColor { get { return Color.Red; } }
public static readonly Color MyOtherColor = Color.Red;
(惰性)初始化后是否存在一些运行时差异?性能用途是否不同?
如果它们是常量,则使用常量:
public const Color MyColor = Color.Red;
为了回答这个问题,这里是 msdn 论坛上的一个很好的阅读:内存消耗:静态字段与静态属性
编辑:
正如乔在评论中指出的那样,Color
不能将其声明为常量,因为它不是编译时常量。
乔回答了这个问题的更好答案。
最后,使用静态只读字段与属性之间不会有明显的区别。使用最适合情况的任何东西。
字段使用指南建议对预定义的对象实例使用公共静态只读字段。例如:
public struct Color
{
// this is a predefined immutable instance of the containing Type
public static readonly Color Red = new Color(0x0000FF);
...
}
在你的情况下,我可能会使用一个属性:
public class MyClass
{
// Not a predefined instance of the containing Type => property
// It's constant today, but who knows, tomorrow its value may come from a
// configuration file.
public static Color MyColor { get { return Color.Red; } }
}
更新
当我看到您的答案时,这很清楚,但是在 System.Drawing 中使用 ILSpy 向我显示了以下代码: public static Color Red { get { return new Color(KnownColor.Red); } }
上面链接的指南(以 Color 为例)适用于 .NET 1.1,并且可能已经演变。就个人而言,我认为使用属性不会出错。 .NET 4.0 Field Guidelines类似,但使用DateTime.MaxValue
和DateTime.MinValue
作为预定义对象实例的示例。
一些实际的考虑: