Załóżmy, że mamy następujący kod:
[Serializable] class Person { public string Name { get; set; } }
Atrybut Serializable mówi, że będzie wspierana serializacja za pomocą IFormatter (np. BinaryFormatter). Jeśli chcemy wspierać ten mechanizm, zawsze powinniśmy tworzyć jawnie backing-field. Kompilator w końcu może wygenerować tak naprawdę dowolną nazwę. Zajrzyjmy do Reflector, aby zobaczyć jak wygląda wewnętrzna struktura:
Wygenerowane pole to:
[CompilerGenerated] private string <Name>k__BackingField;
Nie ma żadnej gwarancji, że te automatycznie wygenerowane pole zawsze będzie miało taką samą nazwę. Serializacja dokonywana jest na podstawie pól a nie właściwości dlatego jest to tak ważne. Poprawna wersja to:
[Serializable] class Person { private string _name; public string Name { get { return _name; } set { _name = value; } } }
Teraz nie jesteśmy skazani na implementację wewnętrzną kompilatora.
Nie do końca się zgodzę z tym postem- twórcy kompilatorów to mądrzy ludzie i zdają się na swojej robocie, a to co sugerujesz byłoby breaking change.
Nigdy nie powinnismy polegac na prywatnych polach – one zawsze maja prawo zmienic sie. Publiczny interfejs zatem nie powinien zmieniac sie.