一个对象的改变也会改变第二个对象

A change in one object changes the second one too

我正在创建两个对象并为它们分配来自 IsolatedStorage 的数据。 但是当我改变一个对象时,第二个对象也会改变。 (我想问题可能是指针相同,但我无法解决。)

private ArrayOfClsSimpleData lstUsers;
private ArrayOfClsSimpleData tmpLstUsers;

在 class' 全局变量中

tmpLstUsers = IsolatedStorageHelper.GetObject<ArrayOfClsSimpleData>("users");
lstUsers = IsolatedStorageHelper.GetObject<ArrayOfClsSimpleData>("users");

数组的第一个状态:

Debug.Write(lstUsers.Count)

输出: 2

Debug.Write(tmpLstUsers.Count)

输出: 2

计数与预期相同。但是,在我将一个项目添加到一个列表后,另一个列表也会更新并且计数仍然相同。

lstUsers.Add(new ArrayOfClsSimpleData());


Debug.Write(lstUsers.Count)

输出: 3

Debug.Write(tmpLstUsers.Count)

输出: 3


编辑:IsolatedStorageHelper class 有助于获取对象、保存对象等,我确实用它来简化事情,所以把它当作从 IsolatedStorage 获取对象.

是这样实现的:

 public static T GetObject<T>(string key)
    {
        if (IsolatedStorageSettings.ApplicationSettings.Contains(key))
        {
            return (T)IsolatedStorageSettings.ApplicationSettings[key];  // return the object 
        }

        return default(T); // if key doesn't exists , return default object
    }

所以它只是从 IsolatedStorage 获取它。 如果您不知道独立存储,您可以从 here

查看

那么,我该如何修复代码,以便在不更改另一个的情况下更改一个?

获取对象时不能使用IClonableClone()方法吗?看起来两个列表对象都获得了相同的引用对象。

问题是 IsolatedStorage 只是返回指向同一数据的两个指针。因此,除非您复制数据,否则所有更改最终都将针对相同的基础数据。

将其视为您家庭住址的两份副本。您对房屋所做的任何更改都会影响您地址的所有副本,因为它只是一个地址,而不是房屋本身。

您要做的是克隆您的对象。内置集合具有内置的克隆或复制方法来执行浅拷贝,或者如果你自己构建了一些东西,你将需要自己实现它

最简单的方法是实现IClonable 接口并使用clone 方法来实现您的复制。 https://msdn.microsoft.com/en-us/library/System.ICloneable.aspx

这基本上涉及为每个复杂对象遍历并调用成员明智的克隆(它将为您复制所有值类型) https://msdn.microsoft.com/en-us/library/system.object.memberwiseclone.aspx

我不认为克隆是必要的。只需创建一个新列表而不是在同一个实例上操作。您可以通过在返回的实例上调用 ToList() 来做到这一点:

lstUsers = IsolatedStorageHelper.GetObject<ArrayOfClsSimpleData>("myKey").ToList();

所以,基本上 lstUserstmpLstUsers 是对同一个对象的引用。您所要做的就是创建一个新的并从原始文件中复制内容。如果您需要快速解决方案,那么您可以这样做(下面的代码)。我只是猜测 ArrayOfClsSimpleData 是某种数组。

lstUsers = IsolatedStorageHelper.GetObject<ArrayOfClsSimpleData>("myKey");
tmpLstUsers = new ArrayOfClsSimpleData();

foreach (object user in lstUsers) // I don't know the type of objects in ArrayOfClsSimpleData, so I wrote 'object', but you should use the actual type
    tmpLstUsers.Add(user);