Кстати, кто-нибудь может дать объяснение следующему замечанию:
Важный момент: Katana не завязана на использовании каких либо интерфейсов или базовых типов, вместо этого определены соглашения, которым должны следовать разработчики.
Чем было продиктовано столь необычное ограничение — отказ от интерфейсов и базовых классов?
Следует заметить, что подход с Expression Tree также не лишён недостатков, помимо низкой производительности в сравнении с CallerMemberName, он также подвержен ошибкам при копировании-вставке кода. Например следующий код верен с точки зрения компилятора, но в нем есть ошибка:
protected bool SetValue<T>(ref T property, T value, Expression<Func<T>> propertyDelegate)
{
if (Object.Equals(property, value))
{
return false;
}
property = value;
OnPropertyChanged(propertyDelegate);
return true;
}
private string property1;
private string property2;
public string Property1
{
get { return this.property1; }
set { SetValue(ref this.property1, value, () => Property1); }
}
public string Property2
{
get { return this.property2; }
set { SetValue(ref this.property2, value, () => Property1); } // Ошибка тут
}
Кстати, есть отличная статья о все возможных способах реализации интерфейса INotifyPropertyChanged.
1. Ваше замечание — справедливо насчет:
2. Ваше замечание — несправедливо насчет:
Это не spellchecker выделяет код, это либо Visual Studio, либо Resharper пытаются намекнуть, что код можно переписать в ином ключе.
Например следующий код:
Может быть заменен на следующий более лаконичный эквивалент:
Однако, стоит заметить, что вариант с использованием ключевого слова «var» не всеми одобряем.
Чем было продиктовано столь необычное ограничение — отказ от интерфейсов и базовых классов?
Надо заметить, что он всё-таки Jon, а не John.
</зануда>
Кстати, есть отличная статья о все возможных способах реализации интерфейса INotifyPropertyChanged.