如何在分配的变量值更改时停止变量更改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 变量 temporiginal。 我在某个时候指定了 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# 中的变量值

C#如何将新变量的基类中的变量值更改为派生类

JavaScript,当变量作为参数传递时更改函数内部的变量值[重复]

如何更改内部类中的变量值[closed]

从活动中更改片段的变量值

如何更新数据流 ssis 中的变量值?