我有一些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}} _ –