我创建了两个对象,并为它们分配了来自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
查看那么,如何修改代码以便我可以在不更改其他代码的情况下更改代码?
答案 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)
因此,基本上lstUsers
和tmpLstUsers
是对同一对象的引用。您所要做的就是创建一个新的并复制原始内容。如果您需要快速解决方案,那么您可以这样做(下面的代码)。我只是猜测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);