C# 要保留引用类型对象值c吗#
这是关于如何保留对象的值。 我有一个对象作为“objData”,它有我的主要结果。我将objData的结果存储在一个变量中C# 要保留引用类型对象值c吗#,c#,asp.net,asp.net-mvc,oop,object,C#,Asp.net,Asp.net Mvc,Oop,Object,这是关于如何保留对象的值。 我有一个对象作为“objData”,它有我的主要结果。我将objData的结果存储在一个变量中 var result = objData; 在此之后,我将从objData中删除一些属性,如下所示 var result1 = objData.remove(x=>x.something..); 然后,如果我选中了“result”,那么它也会被更新,因为它是引用类型对象。如果我在创建“result1”的过程中删除了一些属性,有没有办法为“result”保留相同的值
var result = objData;
在此之后,我将从objData中删除一些属性,如下所示
var result1 = objData.remove(x=>x.something..);
然后,如果我选中了“result”,那么它也会被更新,因为它是引用类型对象。如果我在创建“result1”的过程中删除了一些属性,有没有办法为“result”保留相同的值
这不会复制objData
的值,而只是创建对同一对象的第二个引用。因此,通过result
或objData
对对象所做的任何修改都会被双方“看到”
创建副本取决于对象的类型。有些对象实现了克隆
方法1,有些对象实现了自己的方法,但大多数情况下,您必须创建一个新实例并复制所有状态:
var result = new TheType {
Prop1 = source.Prop1,
Prop2 = source.Prop2,
…
};
当然,对于许多类型来说,这样的克隆毫无意义(例如,管理TCP套接字的对象)
1这是深层克隆—对象是递归克隆还是仅在顶层克隆—取决于类型。objData是列表吗?@WillyDavidJr它是具有多个属性的对象!您能否重新定义
remove
方法以返回应用该方法的对象的副本?remove
方法直接更新源,因此result
在此也会受到影响。要保留结果
,您需要编写具有不同引用位置的自定义复制方法(可能使用新的
运算符)。@无损:但关于创建复制的工作代码(这是一个问题),无论将其放在何处,都是相同的。根据具体情况,任何一种选择都是有效的。如果每次调用remove方法都不需要副本(例如,复制一次,然后删除复制对象上的5个不同属性),则将其放入remove方法是不正确的。但是OP的问题也取决于如何首先进行复制,从这个问题可以看出,他试图分配给不同的变量,但没有说明引用类型是如何工作的。
var result = new TheType {
Prop1 = source.Prop1,
Prop2 = source.Prop2,
…
};