【问题标题】:Want to retain Reference Type object value c#想要保留引用类型对象值c#
【发布时间】:2017-08-22 07:04:59
【问题描述】:

这是关于如何保留对象的值。 我有 1 个对象作为 "objData" 有我的主要结果。我将 objData 的结果存储在 1 个变量中。

var result = objData;

在此之后,我将从 objData 中删除一些属性,如下所示。

var result1 = objData.remove(x=>x.something..);

然后,如果我检查 "result" 那么它也会更新,因为它是引用类型对象,如果我要删除,有什么方法可以为 "result" 保留相同的值创建“result1”期间的一些属性?

【问题讨论】:

  • objData 是一个列表吗?
  • @WillyDavidJr 它是具有多个属性的对象!
  • 您能否重新定义remove 方法以返回它所应用的对象的副本?
  • Remove 方法直接更新源,所以这里result 也受到影响。要保留result,您需要编写具有不同引用位置的自定义复制方法(可能使用new 运算符)。
  • @non破坏性:但是关于创建复制的工作代码(这是个问题),不管你把它放在哪里,它都是一样的。根据具体情况,任何一个选项都是有效的。如果每次调用 remove 方法都不需要副本(例如,复制一次,然后删除复制对象上的 5 个不同属性),那么将其放在 remove 方法中是不正确的。但是 OP 的问题还取决于 如何 首先进行复制,您可以从问题中看到他试图分配给不同的变量但没有考虑引用类型的工作原理。

标签: c# asp.net asp.net-mvc oop object


【解决方案1】:
var result = objData;

这不会复制objData 的值,而只是创建对同一对象的第二个引用。因此,通过resultobjData 对对象所做的任何修改都会被两者“看到”。

制作副本取决于对象的类型。有些对象实现了Clone 方法1,有些实现了自己的方法,但大多数情况下,您必须创建一个新实例并复制所有状态:

var result = new TheType {
  Prop1 = source.Prop1,
  Prop2 = source.Prop2,
 …
};

当然,对于许多类型,这样的克隆没有意义(例如,管理 TCP 套接字的对象)。


1这是一个深度克隆——是递归克隆的对象还是只是顶层——取决于类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 2013-07-14
    相关资源
    最近更新 更多