IsolatedStorageSettings.ApplicationSettings
正在加载数据一次- 而不是在每次访问集合时 - 并将反序列化的值存储在内存中。这是有道理的,因为只有您的应用程序才能访问这些应用程序设置,它们只会在您保存它们时在底层存储上更改。因此,它们不需要在每次访问时重新加载。
由于Order
get 的实例通过引用传递(因为它是 a class
)
Order m = (Order)IsolatedStorageSettings.ApplicationSettings["myKey"]
可能(大致)读作:
- 创建一个地方来存储对类实例的引用
Order
,称为m
- 在类的属性
"myKey"
所持有的当前数据中找到对应于字符串的对象的引用ApplicationSettings
IsolatedStorage
- 指示该位置的对象实际上是
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();