在C#中,類實例是引用類型。這是否意味着可以鎖定由new
返回的值的副本?在我的情況下,我有一些需要鎖定的字段:我可以鎖定類實例變量的副本嗎?
class Foo {
// ...
private Dictionary<IAsyncResult, string> fReadRequests;
private Dictionary<IAsyncResult, string> fWriteRequests;
private Dictionary<IAsyncResult, string> fSyncRequests;
}
在一個特定的方法中,我需要對所有這些字段執行相同的操作。因此,爲了避免代碼重複,我通過將字段複製到數組中來執行循環操作:
var dictArray = new[] { fReadRequests, fWriteRequests, fSyncRequests };
foreach (var reqDict in dictArray) {
lock (reqDict) {
foreach (var i in reqDict) {
// Do something with the request.
}
}
}
這是安全嗎?即使鎖上應用的變量是原件的副本,鎖定是否按預期工作?
不知道這是不是你的意思,但存儲在'reqDict' *中的'Dictionary'不會是字典的副本,它將是對原始字典的引用,所以它將工作就像你複製每個字典的代碼一樣。 –
總之,是的,你的鎖定應該可以正常工作! – Baldrick
@ T.凱利 - 所以參考(不是實例)是一個副本。 –