2015-05-29 56 views
0

我有一個是這樣的一個屬性:是否值得緩存成員結構?

DateTime MinDate 
{ 
    get { return new DateTime(2005, 3, 25); } 
} 

我擔心的是調用Derived.MinDate將構建它被稱爲新DateTime每一次,所以我希望有一個潛在的_MinDate即只構造一旦。

private readonly DateTime _MinDate = new DateTime(2005, 3, 25); 

DateTime MinDate 
{ 
    get { return _MinDate; } 
} 

但這並不產生任何影響可言,因爲DateTime是一個結構反正? 場景1:MinDate構造一個新的DateTime,然後將其複製到調用者。 情景2:_MinDate被複制到MinDate,它被複制到調用者。這兩種情況同樣無效,對嗎?

+0

您是否期望使數百萬這些對象? –

+1

不,第二個例子效率更高,因爲JIT將內聯屬性獲取器,從而消除第二個複製操作。 – Dai

回答

4

在內部,DateTime(Int32, Int32, Int32)構造函數非常便宜:它執行平凡的乘法運算,將年,月和日轉換爲內部64位「Tick」值。 AFAIK CLR不會緩存確定性結構構造函數實例(但它會是一個不錯的優化!)。

不過,如果你調用構造函數數百次每秒我只會緩存此值,但如果你真的想要,那麼這個工程:

private static readonly DateTime _minDate = new DateTime(2005, 3, 25); 
protected override DateTime MinDate { get { return _minDate; } } 
4

幾乎正確;沒有理由這樣做。

通過緩存結構,您需要複製緩存值的字節。

通過構造它,你需要調用構造函數,它將設置結構的字段。

如果構造函數的工作量很大,那麼緩存可能很有用。

DateTime constructor做了一些公平的工作,所以如果你多次致電該屬性,這可能是值得的。
但是,只有在實際發現性能問題時才應該這樣做。

1

您是關於概念正確在傳遞給另一個變量時被複制,因爲DateTime是一個結構體。

這裏是實現你所追求的一種方法: -

abstract class Base 
{ 
    protected abstract void GetMinDate (ref DateTime minDate); 
} 

class Derived 
{ 
    private static readonly DateTime _MinDate; 
    static Derived() 
    { 
     _MinDate = new DateTime(2005, 3, 25); 
    } 
    protected override void GetMinDate (ref DateTime minDate); 
    { 
     minDate = _MinDate; 
    } 
} 

的GetMinDate總是返回由參最小日期,這將是來電者的問題複製或不復制。

+0

+1用於思考(雖然很小)性能開銷的解決方法;這在處理大型結構時肯定會很有用。 –

1

由於C#6.0中,現在與自動實現的屬性初始化做到這一點更簡單的方法:

DateTime MinDate { get; } = new DateTime(y, m, d); 

編輯:這實際上是一個預期的使用功能,並支持字段由編譯器自動生成readonly;實際上,您可以在構造函數中對它們執行set操作。他們被稱爲「只有getter的自動屬性」。有關更多詳細信息,請參見here