2008-11-07 51 views
0

我有一個僞實時數據處理應用程序,我想用LazyInit<double>,所以我不做計算,我不需要,但LazyInit<T>限制T類。我可以解決它,但我顯然寧願不要。爲什麼LazyInit <T>限制爲引用類型

有人知道這是爲什麼嗎?

回答

2

LazyInit中的解釋API選擇的原因。它使用Interlocked.CompareExchange來執行線程安全值集。而泛型僅限於使用類類型。因此LazyInit的T值也必須是一個類。

您可以查看這裏的實現:LazyInit

0

我認爲這是因爲值類型會自動初始化,LazyInit會根據它是否爲null來確定是否需要初始化。你可以通過使用可空類型來繞過它。

LazyInit<double?> 
+0

如果有一個T:類約束,那麼它不會被一個空值類型來滿足。 – 2008-11-07 17:57:48

4

我們目前的(預覽)位只提供一個LazyInit類型,併爲您觀察到的(和JaredPar正確診斷),我們限制噸至引用類型,使我們可以:( i)使LazyInit成爲一個結構體,並且(ii)通過CMPXCHG提供合理的默認行爲(即,我們可以檢查'null'意味着沒有值)。我們可以讓T不受限制,但是決定針對常見情況進行優化 - 否則會導致額外的字節數;相信或不相信,這可能會讓某些人的類型過於昂貴。

我們最近稍微改變了課程。我們目前計劃提供一個LazyInit類型,其中T不受限制另外爲LazyInitField類型,其中T僅限於引用類型。前者是大多數人會使用的,但後者可以用於那些意識到性能並可以忍受T的限制的人。

希望這能夠解決問題。歡呼聲中,

---喬·達菲,PFX開發導致

相關問題