Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
CallerMemberName
для реализации INotifyPropertyChanged
опасно — работа кода после обфускации не гарантирована.Уважаемый производитель, я в своем коде использую [CallerMemberName]
, а после обфускации (у меня ничего не работает|у соседа ничего не работает|мне страшно жить). С уважением, Вася Пупкин
class Test
{
public void Main()
{
DetectName();
DetectName("WTF");
}
public void DetectName([CallerMemberName] string name = null)
{
Console.WriteLine("name: {0}", name);
}
}
DetectName()
в DetectName("Main")
, подставляя туда строковую константу. С точки зрения IL вызовы получаются идентичными. Как обфускатор сможет определить, что в первом случае заменить строку необходимо, а во втором нельзя?CallerMemberName
— иногда бывает необходимо вызвать обновление вообще из другого метода. Например, есть несколько get-only свойств и некий метод Refresh
, который явно запрашивает обновления — или же несколько обновлений в одном setter'е. Так что пока подход с Expression Tree наподобие notify(() => Property)
самый удобный, функциональный и поддерживаемый.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); } // Ошибка тут
}
CallerMemberName
идут ещё CallerLineNumber
и CallerFilePath
(думаю по названиям понятно для чего).
Некоторые полезные атрибуты о которых вы могли не знать