如何在分配的变量值更改时停止变量更改C#
Posted
技术标签:
【中文标题】如何在分配的变量值更改时停止变量更改C#【英文标题】:How to stop a variable from changing as and when the assigned variable value changes C# 【发布时间】:2021-03-16 05:19:47 【问题描述】:我有 ObservableCollection 数据类型的两个 ObservableCollection 变量 temp 和 original。 我在某个时候指定了 original = temp。 临时集合在不同的时间随着不同的值不断变化。 我希望 original 仅在我这样做时才更改:original = temp 并且一直休息它应该保持 old 分配的值 并且不应该更改为 temp变化 。 如何在 C# 中实现这一点。请帮忙
【问题讨论】:
您可能需要一些最少的代码来更好地阐明您的意思。很可能这是一个引用类型问题,您有相同引用的多个副本,其中更改一个会更改另一个。但很难确定 你可能对作业有误解。 --- 如果你的temp
是一个引用类型,你的original
将指向与temp
相同的对象并随之改变。你的original
也是引用类型,你认为你的temp
是一个副本而不是指向同一个对象的指针。 --- 创建原件或临时文件的正确副本,而不仅仅是将一个分配给另一个。仅在完成后分配。
如何实现?
你的 ObservableCollection 的对象类型是什么?
ObservableCollection的对象类型是类数据结构
【参考方案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”类,它可以与有问题的类相互转换并以这种方式工作。
【讨论】:
以上是关于如何在分配的变量值更改时停止变量更改C#的主要内容,如果未能解决你的问题,请参考以下文章
在本机 C++ 中将变量从 C# 编组为 void*,并在本机程序内更改 Managed/C# 中的变量值