Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#当源代码更改时,字典也会更改_C#_Dictionary_Datagridview - Fatal编程技术网

C#当源代码更改时,字典也会更改

C#当源代码更改时,字典也会更改,c#,dictionary,datagridview,C#,Dictionary,Datagridview,当iam向字典添加DatagridviewRow并删除DatagridviewRow时,字典中的DatagridviewRow也会更改。但是我不想让字典改变 Dictionary<int, CustomDataGridViewRow> _cache = new Dictionary<int, CustomDataGridViewRow>(); public void add(int index, CustomDataGridViewRow

当iam向字典添加DatagridviewRow并删除DatagridviewRow时,字典中的DatagridviewRow也会更改。但是我不想让字典改变

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

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


        this.Rows.RemoveAt(1);
Dictionary\u cache=newdictionary();
公共void添加(int索引,CustomDataGridViewRow行)
{
_cache.Add(索引,行);
}
此.Rows.RemoveAt(1);
我试图克隆该行,但我没有复制该行,它生成了一个新行。看看这个:


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

字典不包含对象,它包含引用。字典本身并没有改变——它只是包含了对已经改变的对象的引用

如果您的对象支持克隆,则只需使用:

public void Add(int index, CustomDataGridViewRow row)
{
    _cache.Add(index, (CustomDataGridViewRow) row.Clone());
}
您可能想查看文档以了解更多详细信息


无论哪种方式,了解引用类型在C#中的工作方式都非常重要,否则您会一次又一次地遇到这种情况。

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

这意味着对该行的所有引用都可以看到对该行的更改


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

字典仅包含引用,请先克隆项:

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

看上面的图片。克隆不生成“克隆”,而是生成索引为-1的新行。我做错了什么?因此,如果必须。。。尽管我认为这没有多大意义,但考虑到新行不会与
DataGridView
关联。你还没说你想用这些来实现什么…我是个白痴啊。我现在错过了一些有用的东西,谢谢。对不起,最后的评论