2009-11-30 37 views
1

我在某處讀過,雖然我不記得在C#中使用lock關鍵字可以分配的位置。鎖是否分配

我知道試圖鎖定一個ValueType會填充valuetype,但是還有其他情況嗎?

編輯::

  1. 每個人似乎都回答 ValueType的情況下,我已經知道這個!
  2. 我也知道什麼是鎖和 如何在大深度使用它們,最佳實踐 一般的建議是 不錯 - 但沒用;)
  3. 我需要 知道,因爲我建立一個XNA應用 用於部署在Xbox上。在Xbox 垃圾收集器是很慢 - 這意味着我需要保持 分配到最小,優選 不存在(其防止 集電極從不斷運行)

回答

1

雖然分配看到同步塊內部是懶惰的(但是這是一個實現細節,我從Essential.NET'volume 1'知道IIRC,或者它是通過C#的CLR - 應該被視爲那樣),這個項目需要像你一樣裝箱建議不會出現 - 請參閱Why lock(<integer var>) is not allowed, but Monitor.Enter(<integer var>) allowed?

+0

好吧,以確認鎖定值類型* does *分配,但是鎖定引用類型怎麼辦? – Martin 2009-11-30 14:48:20

+0

@Martin:1.您無法鎖定值類型 - 您需要將其放入並鎖定框。 2.關於引用,它在內部分配了一些東西[在需要的時候是null],但它不是.NET對象,它是CLR擁有的內部結構。例如,你不應該在.NET分析器中看到影響 - 儘管本機級別的mem使用可能會受到影響。這使我們想到'你需要知道什麼'? – 2009-11-30 14:53:00

+0

更新了一些新信息 – Martin 2009-11-30 15:09:08

1

如果您正在考慮使用:

鎖(本)

你應該知道,因爲你正在尋找您的實例,你 類的用戶也可以鎖定它,並擰你。無論這是否是 問題取決於您認爲您的用戶可能會做什麼。

鎖(typeof運算(MyClass的))

如果你不想這樣做,您可以輕鬆地分配一個靜態或實例 對象(即對象:如果你正在做同樣的情況存在 myLock = new object()),然後鎖定它。

Source

至於這個SO question on Locking a resource when obtained...鎖定在一個引用類型VS值類型,有答案:

這取決於類型 - 如果 引用類型則是,如果值爲 ,則輸入no。這也是爲什麼你應該永遠不會鎖定值類型,因爲 值類型將被裝箱,並且任何 後續嘗試鎖定該值的 實際上會獲得另一個對象的鎖 。lock語句的

定義:

鎖聲明(C#參考)

鎖定關鍵字由 獲得互斥標誌着一個語句 塊作爲關鍵部爲給定對象鎖定 ,執行 語句,然後釋放鎖定。

這個SO question on lock keyword in C#也許能夠提供幫助。還可以看Why lock() is not allowed, but Monitor.Enter() allowed?

用於編譯器中的規範定義了behavior of lock like so

lock語句的 表達式的編譯時間類型應 是引用型或>類型 參數(第25.1.1節)已知是 參考類型。 表達式的編譯時類型的編譯時間錯誤 表示值類型。

+0

這告訴我很多關於鎖的一般信息。但它仍不能回答真正的問題。我想知道鎖是否在鎖定引用類型時分配*。如果你閱讀我的問題,我說我*已經知道*關於鎖定值類型:P – Martin 2009-11-30 14:58:05

+0

@Martin:我找不到任何表示它的東西。 – 2009-11-30 15:15:12