为什么读取设置属性值会使SettingsPropertyValue对象变脏?

时间:2015-10-21 14:27:35

标签: c# settingsprovider

在实施自定义设置提供程序时,我注意到访问设置属性的值会将其IsDirty标记更改为true

// Arrange
var property = new SettingsProperty("property1")
{
    PropertyType = typeof(Color),
    DefaultValue = "Green"
};

// Act
var result = new SettingsPropertyValue(property);

// Assert
Assert.That(result.IsDirty, Is.False);
Assert.That(result.PropertyValue, Is.EqualTo(Color.Green));
Assert.That(result.IsDirty, Is.False); // <-- Assertion fails

Reflector给出了一个问题的答案,为什么PropertyValue getter的行为是这样的 - 它包含如下语句:

if (_Value != null && !Property.PropertyType.IsPrimitive && !(_Value is string) && !(_Value is DateTime))
{
    _UsingDefaultValue = false;
    _ChangedSinceLastSerialized = true;
    _IsDirty = true;
}

乍一看奇怪的举动有没有人对此有所了解?

1 个答案:

答案 0 :(得分:6)

documentation表示这是为了解决在复杂类型时访问值的任何潜在副作用,以及在不重新分配值的情况下改变值(例如,在修改值时列表):

  

在以下条件下,IsDirty属性设置为 true

     
      
  1. [...]

  2.   
  3. 访问SettingsPropertyValue对象中包含的值,该值不是字符串或基本类型,例如 int float 真实,或日期时间。当SettingsPropertyValue对象管理的值是复杂类型(例如ArrayList)时,SettingsPropertyValue对象无法检测何时进行了更改。因此,一旦从PropertyValue属性访问复杂类型,SettingsPropertyValue对象就会认为复杂类型是脏的。

  4.