winforms C#将一个引用类型赋值给另一个引用类型,而不需要它对对象的引用

dldeef67  于 2023-04-07  发布在  C#
关注(0)|答案(4)|浏览(227)

我可以给引用类型赋值而不给它对象的引用吗?就像我有一个获取文件信息的函数,我想检查它是否在不同的线程中发生了变化。
示例

info = GetInfo(path);
checkInfo=info; // I make changes to info later, but I wanna checkInfo to remain the same
p4tfgftt

p4tfgftt1#

据我理解你的问题,你需要创建一个深拷贝的信息对象
下面是一个solution(使用序列化)
像这样创建扩展方法:

public static class ExtensionMethods
{
    // Deep clone
    public static T DeepClone<T>(this T a)
    {
        using (MemoryStream stream = new MemoryStream())
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, a);
            stream.Position = 0;
            return (T) formatter.Deserialize(stream);
        }
    }
}

使用它:

checkInfo = info.DeepClone();

通常,需要深度克隆意味着需要代码重构。不一定,但经常..我认为应该有一个更好的解决方案,在你的情况下,比复制对象。

hc8w905p

hc8w905p2#

你要么需要克隆info变量,要么需要重新分配它。手工克隆它将是相当多的工作,而且可能很脆弱,所以我建议这样做:

checkInfo = info:
info = GetInfo(path);

另一个选择,如果你在到达这里之前没有改变info变量,将使用GetInfo设置checkInfo。考虑这样一个事实,如果是这种情况,GetInfo将为两者构建相同的对象,因此你会得到相同的结果。

u4dcyp6a

u4dcyp6a3#

您可以将FileInfo类隐藏/ Package 在另一个类中,并让其他线程仅访问 Package 类。 Package 类可以在其他线程更改FileInfo时触发事件,例如FileInfoChanged。

dfuffjeb

dfuffjeb4#

我认为最简单的解决方法是:

info = GetInfo(path);
checkInfo=GetInfo(path);

然后,您可以更改信息,而checkInfo不会受到更改的影响。

相关问题