3

在实现自定义设置提供程序时,我注意到访问设置属性的值会将其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 为我回答了为什么PropertyValuegetter 行为如此的问题 - 它包含如下语句:

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

乍一看,任何人都可以对这种奇怪的行为有所了解吗?

4

1 回答 1

6

文档指出,这是为了解决当它是复杂类型时访问该值的任何潜在副作用,以及在不重新分配该值的情况下改变该值(例如在修改列表中的项目时):

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

  1. [...]

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

于 2015-10-21T14:34:01.880 回答