ICollection.Clear从复制对象中删除数据

时间:2015-06-02 07:45:34

标签: c# .net

MyRequest copyRequest = new MyRequest(); 
copyRequest = request; 
copyRequest.MyList.Clear();

我有以上代码

MyList是一个字符串列表

当我调用copyRequest.MyList.Clear()

它还会清除request.MyList。

有没有办法只清除copyRequest.MyList

3 个答案:

答案 0 :(得分:5)

此代码:

MyRequest copyRequest = new MyRequest(); 
copyRequest = request; 

...不会创建request的副本。它只是重新分配request的引用,因此它是一个带有2个别名的对象,而使用new运算符创建的实例将是GCd,因为它没有引用。

您需要实施IClonable,然后负责创建MyRequest对象的深层副本,包括MyList项。

答案 1 :(得分:0)

通过将request分配给copyRequest这两个变量引用相同的对象。因此,如果您清除影响引用此对象的所有变量的列表。

您必须创建一个新的MyRequest并将原始请求中的所有相关对象分配给“已复制”。我假设默认情况下列表为空,因此您无需分配和清除它。

MyRequest copyRequest = new MyRequest(); 
copyRequest.Property1 = request.Property1;
copyRequest.Property2 = request.Property2;
copyRequest.Property3 = request.Property3;

由于J. Skeet更好地解释了引用和变量的区别,这里引用了一句话:

  

我经常使用的一个类比是房子。假设我们有两件   纸(变量)。两个部分都写有相同的房屋地址   paper(这是每个变量的值,参考)。只有   一个房子。如果有人用第一张纸去了   房子,然后把门涂成红色,他们没有改变任何事情   他们的纸 - 他们正在改变房子的一些东西。   然后如果有人用第二张纸去了房子,   他们会看到前门也是红色的。然而,只有一所房子   许多纸上写着地址。

更详细:http://jonskeet.uk/csharp/references.html

答案 2 :(得分:0)

正如其他人所指出的那样,您正在复制引用,而不是MyList的内容。

您不清楚自己在代码中尝试实现的目标,但看起来您想要的是一个新的MyRequest,除了{{1你要成为emtpy的。您可能想要做的是创建一个方法,生成一个新的MyList,而不是空MyRequest

请记住,MyList中的任何引用都与MyRequest的行为大致相同。即,如果MyList是引用类型,则为以下

Property1

将导致myResultCopy.Property1 = myResultOriginal.Property1 myResultCopy.Property1引用同一个实例。因此myResultOriginal.Property1的用户可以看到对myResultCopy.Property1的任何更改。