List(T)集合何时被“修改”?

时间:2013-09-27 07:46:22

标签: c# list thread-safety

根据List(T)http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx的文档,一个集合支持多个读者。只要不修改集合。

我的问题是什么时候修改了一个集合?

  • 当我更改列表中的值时?例如List<int>intList[0] = 1;
  • 当我添加/删除列表中的某些内容时?例如,intList.add(1);

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

对于列表,当您从数组中添加或删除元素时,它会被视为已修改,或者您更改了元素的内容,因此您的示例都确实“修改”了该集合。

但作为旁注:对于数组,在这种情况下,你实际上无法“修改”集合。

所以我们在List<T>和T的普通数组之间的行为有明显的区别。

例如,此代码抛出异常:

var testList = Enumerable.Range(1, 10).ToList();

foreach (var i in testList)
{
    testList[0] = 1;
}

但是这段代码抛出异常:

var testArray = Enumerable.Range(1, 10).ToArray();

foreach (var i in testArray)
{
    testArray[0] = 1;
}

更改元素中存储的引用类型的属性

请注意,如果您有一个引用类型的列表,并且您更改了其中一个列表元素的属性之一,则计为修改集合。

例如,给定这个类:

class Element
{
    public int Value
    {
        get;
        set;
    }
}

以下代码不会引发异常:

List<Element> list = new List<Element>()
{
    new Element(),
    new Element()
};

foreach (var element in list)
{
    list[0].Value = 1;
}

它不计入修改集合的原因是您没有更改元素的内容,因为引用本身保持完全相同。

答案 1 :(得分:2)

  

我的问题是什么时候修改了一个集合?

     

当我更改列表中的值时?例如List<int>, intList[0] = 1;

是的,更改项目确实会改变集合。

但是,如果您T的{​​{1}}是引用类型,并且您没有更改整个对象(例如,只更改一个类属性值),则不会修改该集合。例如考虑具有List<T>属性Foo的<{1}}课程。

int

以下代码 修改集合:

Bar

以下修改集合:

List<Foo> items = new List<Foo> { new Foo(), new Foo() };
  

当我添加/删除列表中的某些内容时?例如,intList.add(1);

它总是修改集合。