如何阻止变量在分配的变量值更改时更改 C#

How to stop a variable from changing as and when the assigned variable value changes C#

提问人:Lavanya 提问时间:12/4/2020 更新时间:12/4/2020 访问量:1539

问:

我有两个 ObservableCollection 变量 temp 和 ObservableCollection 数据类型的原始变量。 我已经在某个时候分配了 original = temp。 Temp Collection 在不同的时间以不同的值不断变化。 我希望 original 仅在我这样做时更改:original = temp 特别是并始终休息,它应该保持旧的分配值,并且不应该在它发生变化时更改为 temp。 我怎样才能在 C# 中实现这一点。请帮忙

C# 变量 引用传递

评论

2赞 TheGeneral 12/4/2020
您可能需要一些最少的代码来更好地阐明您的意思。这可能是一个引用类型问题,其中您有同一引用的多个副本,其中更改一个副本会更改另一个副本。但很难确定
2赞 CosmicGiant 12/4/2020
您可能对分配有误解。--- 如果 u 是引用类型,则 u 将指向相同的对象,并随之更改。同样也是如此,你是引用类型,你认为你的是一个副本,而不是指向同一对象的指针。--- 创建原始副本或临时副本的适当副本,而不仅仅是将一个副本分配给另一个副本。仅在完成后分配。temporiginaltemporiginaltemp
0赞 Lavanya 12/4/2020
如何实现?
0赞 Attila Szász 12/4/2020
ObservableCollection 的对象类型是什么?
0赞 Lavanya 12/4/2020
ObservableCollection 的对象类型是一个类数据结构

答:

0赞 The Lemon 12/4/2020 #1

最简单的方法是在创建临时时对原始文件进行深度复制。默认情况下,复制任何复杂对象只会对对象引用进行浅层复制(基本上,它会使新变量指向与旧变量相同的位置),因此任何更改都将反映在两个变量中。您想要的是具有相同数据的新对象。实现此目的的最简单方法是使用 Json 进行深度复制

public static T Clone<T>(T baseObject)
{
    return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(baseObject));
}

在代码中,当您创建 temp 时,以及每当您将 original 设置为 temp 的值时,请使用 clone 方法,而不仅仅是设置 'original=temp'。上面的代码使用 json 将你的对象转换为它的 json 字符串表示形式,然后使用所述字符串创建一个完全独立的对象

请注意,此方法并不总是适用:

您正在使用的类可能具有内置的深度复制方法。例如,XElement 将允许您将 XElement 传递给其构造函数以进行深度复制,如果您使用的类具有这样的方法,则该方法可能比仅使用 Json 进行深度复制更优化。大多数类都可以使用 json,但根据类的不同,使用显式深度复制方法可能更安全。

您的类也可能是自引用的,缺少空构造函数,包含具有这些属性的其他类,或者它可能具有一些其他属性,使 json 转换出现问题。如果是这种情况,您可能需要创建自己的深层复制方法。基本上,只需将另一个构造函数添加到您的类中,该构造函数接受其自身的实例 - 在构造函数中复制每个简单属性,对于每个复杂属性,jsonCopy 属叉或处理它,但在您的用例中效果最好。你通常不需要走这么远,但对于非常复杂的课程,你可能不得不这样做。您还可以创建一个“json Friendly”类,该类可以与有问题的类相互转换,并以这种方式工作。