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

时间:2015-02-27 11:42:53

标签: c# windows-phone-8 isolatedstorage

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

private ArrayOfClsSimpleData lstUsers;
private ArrayOfClsSimpleData tmpLstUsers;

课堂上'全局

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类可以帮助获取对象,保存对象等我用来简化事物,所以只需将其视为从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

查看

那么,如何修改代码以便我可以在不更改其他代码的情况下更改代码?

4 个答案:

答案 0 :(得分:1)

获取对象时,是否无法使用Clone() IClonable方法?看起来两个列表对象都得到相同的引用对象。

答案 1 :(得分:1)

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

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

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

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

因此,基本上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);