using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
class Program {
// *** before: ***
// the name of the property was repeated as a string, and a rename left
// the string behind - silently, without a single warning
class PersonOld : INotifyPropertyChanged {
string name;
public event PropertyChangedEventHandler PropertyChanged;
public string Name {
get { return name; }
set {
name = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Name"));
}
}
}
// *** in version 5.0: ***
class Person : INotifyPropertyChanged {
string name;
public event PropertyChangedEventHandler PropertyChanged;
public string Name {
get { return name; }
set { name = value; Changed(); }
}
// the compiler puts the name of the CALLING member into the argument
void Changed([CallerMemberName] string member = null) {
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(member));
}
}
static void Main() {
PersonOld old = new PersonOld();
old.PropertyChanged += (s, e) => Console.WriteLine("old: " +
e.PropertyName);
old.Name = "Ann";
Person person = new Person();
person.PropertyChanged += (s, e) => Console.WriteLine("new: " +
e.PropertyName);
person.Name = "Bob";
}
}