0

我一直在尝试获取独立存储设置以在 windows phone 7.5 应用程序中保存一些数据。我可以成功地保存和加载简单的类型,比如整数,但是由于某种原因,当我使用我自己的类时它不能正常工作。我希望能够从 ISO 设置中读取,操作数据,然后选择“不保存”,以便应用程序再次从 ISO 读取,但由于某种原因,ISO 加载了已被操作的数据,而不是原始保存的数据。下面是一些简单的 c# 代码来解释这个问题:

Order k = new Order(){ID=5}; // create order with ID of 5
IsolatedStorageSettings.ApplicationSettings.Add("mykey", k); // Save to ISO
IsolatedStorageSettings.ApplicationSettings.Save();

Order m = (Order)IsolatedStorageSettings.ApplicationSettings["myKey"]; // M = 5
m.ID = 6; // Change ID number
m = (Order)IsolatedStorageSettings.ApplicationSettings["myKey"]; // M = 6???

为什么最后m = 6?不应该是 5,因为我从未保存更改的 ID 号吗?这是某种指针问题吗?我该如何解决这个问题?

4

1 回答 1

2

IsolatedStorageSettings.ApplicationSettings正在加载数据一次- 而不是在每次访问集合时 - 并将反序列化的值存储在内存中。这是有道理的,因为只有您的应用程序才能访问这些应用程序设置,它们只会在您保存它们时在底层存储上更改。因此,它们不需要在每次访问时重新加载。

由于Orderget 的实例通过引用传递(因为它是 a class

Order m = (Order)IsolatedStorageSettings.ApplicationSettings["myKey"]

可能(大致)读作:

  • 创建一个地方来存储对类实例的引用Order,称为m
  • 在类的属性"myKey"所持有的当前数据中找到对应于字符串的对象的引用ApplicationSettingsIsolatedStorage
  • 指示该位置的对象实际上是Order该类的实例或引用为空(否则抛出异常)
  • 使引用与我们刚刚找到m的类的实例在内存中相同的对象Order

这意味着m通过检查可以观察到对值的操作(Order)IsolatedStorageSettings.ApplicationSettings["myKey"],反之亦然。简而言之,m不只是等于应用程序设置中的值 - 它应用程序设置中的值。

m为了避免影响从设置中读取的值,您应该在这里做的是提供一种机制来复制/克隆Order对象并在副本上进行更改。如果您对所做的更改感到满意,请将对象的副本放回应用程序设置中,以便进一步的操作不会显示在那里(而不是实际保存的数据)。

有一个烘焙接口用于指示可以复制/克隆的东西,它是ICloneable

例子:

public class Order : ICloneable
{
    public int ID { get; set; }
    public object Clone()
    {
        return new Order { ID = ID };
    }
}

示例用法:

Order k = new Order(){ID=5}; // create order with ID of 5
IsolatedStorageSettings.ApplicationSettings.Add("mykey", k); // Save to ISO
IsolatedStorageSettings.ApplicationSettings.Save();

Order m = (Order)((Order)IsolatedStorageSettings.ApplicationSettings["myKey"]).Clone(); // M = 5
m.ID = 6; // Change ID number
m = (Order)((Order)IsolatedStorageSettings.ApplicationSettings["myKey"]).Clone(); // M = 5

但是,您可以Order按如下方式编写类并避免进行第二次强制转换:

public class Order : ICloneable
{
    public int ID { get; set; }

    public Order Clone()
    {
        return new Order { ID = ID };
    }

    object ICloneable.Clone()
    {
        return Clone();
    }
}

像这样使用它:

Order m = ((Order)IsolatedStorageSettings.ApplicationSettings["myKey"]).Clone();
于 2013-06-01T08:05:34.707 回答