2015-04-01 66 views
4

不好意思問這個問題,我一直在谷歌搜索一下,但似乎是克隆或複製方法的參考,而不是在C#我的問題的實際答案。C#:將數組分配給另一個數組:複製或指針交換?

我有兩個字節數組,他們正在被兩個線程訪問。

private byte[] buffer1 = new byte[size]; 
private byte[] buffer2 = new byte[size]; 

我的目標是在buffer1寫在Thread1,搶互斥,開關周圍的指針和重複這個過程。 Thread2會抓住一個互斥體,並總是讀取buffer2

目標是Thread2運行速度很快,並且不受在Thread1中進行復制的影響。

我很清楚,當我做下面會發生什麼:

byte[] temp = buffer1; 
buffer1 = buffer2; 
buffer2 = temp; 

是指針被切換或複製到buffer1buffer2的內容?這應該是一個簡單的問題,但我似乎無法找到解決方案。 Thread1正在做Marshal.Copy(),我不希望該調用影響Thread2

+3

你有沒有試過做一些測試,看看會發生什麼? :) – 2015-04-01 19:09:57

+2

在你的代碼片段'buffer1'和'buffer2'結束引用到相同的數組。我假設你打算在經典交換中使用'temp'。 – 2015-04-01 19:11:47

+2

馬上編輯它,謝謝:)我錯誤地複製了那個。 – Jary316 2015-04-01 19:17:20

回答

12

賦值始終只是將一個表達式的值複製到變量中(或調用屬性/索引器設置器)。

在你的情況,這一點:

buffer1 = buffer2; 

...的buffer2值只是一個參考字節數組。所以在賦值之後(並且假設沒有其他賦值),對字節數組「via」進行的更改將通過一個變量顯示爲「via」另一個變量。

這是不特定於數組類型 - 這是引用類型是如何工作的,一路過關斬將.NET:

StringBuilder x = new StringBuilder(); 
StringBuilder y = x; 
x.Append("Foo"); 
Console.WriteLine(y); // Foo 

這只是一個認識,數組總是引用類型的問題。

+0

真棒,非常感謝!這真的是我想知道的,謝謝! – Jary316 2015-04-01 19:17:59

7

Array分類爲a reference type,所以沒有副本,只有引用分配。使用Array.CopyTo方法將一個數組的內容複製到另一個。

此行爲與C++不同,您可以在其中覆蓋=運算符。在.NET中,你不能覆蓋它,並且沒有辦法在分配中複製某些集合的內容。

其他的事情,你想要做的reference assign是一個原子操作,所以你可以考慮在你的代碼中使用lock-free算法來處理這部分代碼。

+0

非常感謝!這現在非常清楚! – Jary316 2015-04-01 19:18:24

相關問題