我有一些intialized属性/字段是“常数”,我想知道哪个以下行的一个是最好的使用方法:静态属性格式或静态readony场
public static Color MyColor { get { return Color.Red; } }
public static readonly Color MyOtherColor = Color.Red;
(懒惰)初始化后是否存在一些运行时差异? 性能使用不同?
我有一些intialized属性/字段是“常数”,我想知道哪个以下行的一个是最好的使用方法:静态属性格式或静态readony场
public static Color MyColor { get { return Color.Red; } }
public static readonly Color MyOtherColor = Color.Red;
(懒惰)初始化后是否存在一些运行时差异? 性能使用不同?
Field usage guidelines建议对预定义的对象实例使用公共静态只读字段。例如:
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; } }
}
UPDATE
它晶莹剔透,当我看到你的答案,但使用ILSpy在System.Drawing显示我下面的代码:public static Color Red {get {return new Color(KnownColor.Red); }}
上面链接的指南(使用Color作为示例)适用于.NET 1.1并且可能已经发展。就个人而言,我不认为你可以通过使用财产出错。 .NET 4.0 Field Guidelines类似,但使用DateTime.MaxValue
和DateTime.MinValue
作为预定义对象实例的示例。
如果他们是常数,然后用一个常数:
public const Color MyColor = Color.Red;
在回答这个问题,这里在MSDN论坛上很好看的:Memory consumption: static fields vs static properties
编辑:
As乔在评论中指出,Color
不能被声明为常量,因为它不是一个编译时间常量。
A better answer这个问题由Joe回答。
最后,在使用静态只读字段和属性之间没有明显的区别。根据情况使用最适合的方法。
你可能想解释为什么你可以在这里使用const。当右边的表达式是编译时间常量时,只需要使用'static readonly'。由于'Color.Red'是一个在编译时已知的值,所以当需要'new'或某个函数运行时,不需要'static readonly'。如果你在编译时不知道*颜色(因为你需要加载首选项),那么这个值就是函数的结果,并且需要'static readonly'。 – Crisfole
@ChristopherPfohl - 我认为你已经在解释它已经做得很好;)+1 –
System.Drawing.Color类型不能被声明为const。但即使对于原始类型,在可能的情况下,请注意,如果值发生更改,则需要重新编译引用常量值的任何程序集。 – Joe
清楚地看到你的答案,但在System.Drawing中使用ILSpy显示我以下代码: _public static Color红色{get {return new Color(KnownColor.Red); \t}} _ –