提问人:Lavanya 提问时间:12/4/2020 更新时间:12/4/2020 访问量:1539
如何阻止变量在分配的变量值更改时更改 C#
How to stop a variable from changing as and when the assigned variable value changes C#
问:
我有两个 ObservableCollection 变量 temp 和 ObservableCollection 数据类型的原始变量。 我已经在某个时候分配了 original = temp。 Temp Collection 在不同的时间以不同的值不断变化。 我希望 original 仅在我这样做时更改:original = temp 特别是并始终休息,它应该保持旧的分配值,并且不应该在它发生变化时更改为 temp。 我怎样才能在 C# 中实现这一点。请帮忙
答:
最简单的方法是在创建临时时对原始文件进行深度复制。默认情况下,复制任何复杂对象只会对对象引用进行浅层复制(基本上,它会使新变量指向与旧变量相同的位置),因此任何更改都将反映在两个变量中。您想要的是具有相同数据的新对象。实现此目的的最简单方法是使用 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”类,该类可以与有问题的类相互转换,并以这种方式工作。
评论
temp
original
temp
original
temp