0

我可以在不引用该对象的情况下为引用类型赋值吗?就像我有获取文件信息的函数一样,我想检查一下稍后在不同的线程中是否发生了变化。

例子

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

3 回答 3

0

您要么需要克隆 info 变量,要么需要重新分配它。手动克隆它需要相当多的工作,而且可能很脆弱,所以我推荐这样的东西:

checkInfo = info:
info = GetInfo(path);

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

于 2013-03-28T10:14:46.770 回答
0

据我了解您的问题,您需要创建 info 对象的深层副本

这是一个解决方案(使用序列化)

像这样创建扩展方法:

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();

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

于 2013-03-28T10:15:10.020 回答
0

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

于 2013-03-28T10:28:43.057 回答