2014-02-16 34 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指向内存中相同的实际数组。