Почему чтение значения свойства settings делает объект SettingsPropertyValue грязным?

При реализации провайдера пользовательских настроек я заметил, что доступ к значению свойства настройки изменяет его 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

Отражатель дает мне ответ на вопрос, почему PropertyValue getter ведет себя так: он содержит следующее утверждение:

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

Кто-нибудь может пролить свет на это на первый взгляд странное поведение?

1 ответ

Решение

В документации говорится, что это должно учитывать любые потенциальные побочные эффекты доступа к значению, когда оно является сложным типом, а также изменение значения без переназначения значения (например, при изменении элементов в списке):

Свойство IsDirty имеет значение true при следующих условиях:

  1. [...]

  2. Доступ к значению, содержащемуся в объекте SettingsPropertyValue, не является строкой или типом примитива, таким как int, float, real или DateTime. Когда значение, управляемое объектом SettingsPropertyValue, является сложным типом (например, ArrayList), объект SettingsPropertyValue не может обнаружить, когда были внесены изменения. В результате объект SettingsPropertyValue пессимистически предполагает, что сложный тип является "грязным" после обращения к нему из свойства PropertyValue.

Другие вопросы по тегам