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

本文关键字:对象 SettingsPropertyValue 读取 设置 属性 为什么 | 更新日期: 2023-09-27 18:18:37

在实现自定义设置提供程序时,我注意到访问设置属性的值会将其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;
}
有谁能解释一下这个乍一看奇怪的行为吗?

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

文档说明,这是为了考虑访问复杂类型的值的任何潜在副作用,以及在不重新赋值的情况下改变值(例如在修改列表中的项时):

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

  1. […]

  2. 访问SettingsPropertyValue对象中包含的值,该值不是字符串或基本类型,如intfloatrealDateTime。当由SettingsPropertyValue对象管理的值是复杂类型(例如ArrayList)时,SettingsPropertyValue对象无法检测何时进行了更改。因此,SettingsPropertyValue对象悲观地假设,一旦从PropertyValue属性访问了一个复杂类型,它就是脏的。