Getters, setters, les propriétés et les meilleures pratiques. Java et C#

Je vais prendre une classe C#, et je suis en train de trouver la meilleure façon de faire les choses. Je viens d'une Java d'arrière-plan et donc je ne suis familier avec Java meilleures pratiques; je suis un C# débutant!

En Java si j'ai une propriété privée, je le fais;

private String name;

public void setName(String name) {
   this.name = name;
}

public String getName() {
   return this.name;
}

En C#, je vois qu'il y a de nombreuses façons de le faire.

Je peux le faire comme Java:

private string name;

public void setName(string name) {
   this.name = name;
}

public string getName() {
   return this.name;
}

Ou je peux le faire de cette façon:

private string name;

public string Name {
   get { return name; }
   set { name = value; }
}

Ou:

public string Name { get; set; }

Qui dois-je utiliser, et quelles sont les mises en garde ou des subtilités de chaque approche? Lors de la création de classes, je suis en général les meilleures pratiques que je sais de Java (en particulier la lecture Efficace Java). Ainsi, par exemple, je suis en favorisant l'immutabilité (en fournissant des setters seulement quand c'est nécessaire). Je suis juste curieux de voir comment ces pratiques s'inscrivent dans les différentes façons de fournir les setters et getters en C#, pour l'essentiel, comment pourrais-je traduire les meilleures pratiques du monde Java en C#?

MODIFIER

J'ai été poster cela dans un commentaire de Jon Skeet réponse mais cela a longtemps:

À propos d'une non-propriété triviale (c'est à dire, avec un traitement important et de validation peut-être)? Pourrais-je encore exposer via une propriété publique, mais avec la logique encapsulé dans get et set? Pourquoi/je ferais ça plus le fait d'avoir un setter et getter méthodes (avec des associés de traitement et de validation de la logique).