源更改时C#字典更改

时间:2012-02-15 20:43:39

标签: c# dictionary datagridview

当我将一个DatagridviewRow添加到Dictionary并删除DatagridviewRow时,Dictionary中的Datagridviewrow也会发生变化。但我不希望字典改变

        Dictionary<int, CustomDataGridViewRow> _cache = new Dictionary<int, CustomDataGridViewRow>();

        public void add(int index, CustomDataGridViewRow row)
        {
            _cache.Add(index, row);
        }


        this.Rows.RemoveAt(1);

我尝试了克隆行,但是我没有复制该行,它创建了一个新行。看看这个:

enter image description here

3 个答案:

答案 0 :(得分:4)

然后,您需要在添加字典条目之前克隆该对象。

字典不包含对象 - 它包含引用。字典本身不是更改 - 它只包含对已更改的对象的引用。

如果您的对象支持克隆,您可以使用:

public void Add(int index, CustomDataGridViewRow row)
{
    _cache.Add(index, (CustomDataGridViewRow) row.Clone());
}

您可能希望查看DataGridViewRow.Clone的文档,了解更多详情......

无论哪种方式,非常重要的是你了解引用类型在C#中的工作方式,否则你会不断碰到这一点。

答案 1 :(得分:2)

当您将row添加到字典中时,您正在向该行添加引用

这意味着所有对它的引用都会看到对行的更改。

您可以通过向字典(也称为克隆)提供行的副本来避免这种情况。

答案 2 :(得分:1)

字典只包含一个引用,首先克隆该项:

_cache.Add(index, row.Clone());