MyRequest copyRequest = new MyRequest();
copyRequest = request;
copyRequest.MyList.Clear();
我有以上代码
MyList是一个字符串列表
当我调用copyRequest.MyList.Clear()
时它还会清除request.MyList。
有没有办法只清除copyRequest.MyList
答案 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(这是每个变量的值,参考)。只有 一个房子。如果有人用第一张纸去了 房子,然后把门涂成红色,他们没有改变任何事情 他们的纸 - 他们正在改变房子的一些东西。 然后如果有人用第二张纸去了房子, 他们会看到前门也是红色的。然而,只有一所房子 许多纸上写着地址。
答案 2 :(得分:0)
正如其他人所指出的那样,您正在复制引用,而不是MyList
的内容。
您不清楚自己在代码中尝试实现的目标,但看起来您想要的是一个新的MyRequest
,除了{{1你要成为emtpy的。您可能想要做的是创建一个方法,生成一个新的MyList
,而不是空MyRequest
。
请记住,MyList
中的任何引用都与MyRequest
的行为大致相同。即,如果MyList
是引用类型,则为以下
Property1
将导致myResultCopy.Property1 = myResultOriginal.Property1
和myResultCopy.Property1
引用同一个实例。因此myResultOriginal.Property1
的用户可以看到对myResultCopy.Property1
的任何更改。