Изменения в новых версиях / C# 5.0

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(thisnew PropertyChangedEventArgs("Name"));
            }
        }
    }

    // *** in version 5.0: ***
    class Person : INotifyPropertyChanged {
        string name;
        public event PropertyChangedEventHandler PropertyChanged;
        public string Name {
            get { return name; }
            set { name = valueChanged(); }
        }

        // the compiler puts the name of the CALLING member into the argument
        void Changed([CallerMemberName] string member = null) {
            if (PropertyChanged != null)
                PropertyChanged(thisnew 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";
    }
}