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



我正在创建两个对象,并用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中获取。如果你不知道隔离存储,你可以从这里看到

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

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

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

把它想象成你家庭地址的两份副本。你在家里更改的任何内容都会影响你地址的所有副本,因为这只是一个地址,而不是家本身。

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

最简单的方法是实现IClonable接口,并使用克隆方法来实现复制。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();

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

相关内容

最新更新