2014-02-16 65 views
1

設置一個類的字段我有這個類:在一個線程

public class SortingModel<T> where T : System.IComparable { 
    private readonly List<T> _input; 
    private List<T> _inputCopy; 

    public SortingModel(List<T> parameter) { 
     _inputCopy = _input = parameter; 
    } 
} 

在下面的功能,_Input場_inputCopy而改變,但我不知道爲什麼。

public void Foo() 
{ 
    for(Int32 j = 0; j < _inputCopy.Count; ++j) 
    { 
     T temp = _inputCopy[j]; 
     _inputCopy[j] = _inputCopy[j + 1]; 
     _inputCopy[j + 1] = temp; 
     //_input changes there, too 
    } 
} 

我執行函數var op = ThreadPool.RunAsync(delegate { _model.Foo(); });。 所以問題是,爲什麼_input改變?

+2

你從來沒有真正複製過任何東西。 – SLaks

回答

1

通過將_input_inputCopy分配給相同的參數,您將它們都指向相同的列表。對列表的任何更改都將對所有參考都可見。

如果你想的parameter的元素(淺)副本,可以爲_inputCopy創建一個新的列表:

public SortingModel(List<T> parameter) { 
     _input = parameter; 
     _inputCopy = new List<T>(parameter); 
    } 

我懷疑你可能還需要從你的循環結束更改爲j < _inputCopy.Count - 1否則_inputCopy[j + 1]將超出。

順便說一句,使用readonly這裏只是意味着,一旦List<>領域_input_inputCopy在構造函數中分配,該字段不能被重新分配。這並不意味着列表中的內容不能被改變(如果T是引用類型,那麼T元素仍然可以被突變,這對於任何引用這個T的變量也是可見的)。

+0

謝謝,循環條件在程序中是正確的,我只是複製它不正確。我使用了_inputCopy.AddRange(_input);' – Daniel

2

因爲在.NET數組中是引用類型,所以你的_input_inputCopy指向內存中相同的實際數組。