Eu daria um passo adiante e o levaria a três casos. Embora existam variações em cada uma, estas são as regras que uso na maioria das vezes na programação em C #.
Nos casos 2 e 3, sempre vá para o Acessador de propriedades (não a variável de campo). E no caso 1, você é salvo de ter que fazer essa escolha.
1.) Propriedade imutável (passada para o construtor ou criada no momento da construção). Nesse caso, eu uso uma variável de campo, com uma propriedade somente leitura. Eu escolho isso ao invés de um setter privado, pois um setter privado não garante imutabilidade.
public class Abc
{
private readonly int foo;
public Abc(int fooToUse){
foo = fooToUse;
}
public int Foo { get{ return foo; } }
}
2.) variável POCO. Uma variável simples que pode obter / definir em qualquer escopo público / privado. Nesse caso, eu usaria apenas uma propriedade automática.
public class Abc
{
public int Foo {get; set;}
}
3.) Propriedades de ligação do ViewModel. Para classes que suportam INotifyPropertyChanged, acho que você precisa de uma variável de campo de apoio privada.
public class Abc : INotifyPropertyChanged
{
private int foo;
public int Foo
{
get { return foo; }
set { foo = value; OnPropertyChanged("foo"); }
}
}