Estoy tomando una clase de C # en este momento y estoy tratando de encontrar la mejor manera de hacer las cosas. Vengo de una experiencia en Java, por lo que solo estoy familiarizado con las mejores prácticas de Java; ¡Soy un novato en C #!
En Java, si tengo una propiedad privada, hago esto;
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
En C #, veo que hay muchas formas de hacer esto.
Puedo hacerlo como Java:
private string name;
public void setName(string name) {
this.name = name;
}
public string getName() {
return this.name;
}
O puedo hacerlo de esta manera:
private string name;
public string Name {
get { return name; }
set { name = value; }
}
O:
public string Name { get; set; }
¿Cuál debería usar y cuáles son las advertencias o sutilezas involucradas con cada enfoque? Al crear clases, sigo las mejores prácticas generales que conozco de Java (especialmente leyendo Effective Java). Entonces, por ejemplo, estoy favoreciendo la inmutabilidad (proporcionando setters solo cuando sea necesario). Solo tengo curiosidad por ver cómo encajan estas prácticas con las diversas formas de proporcionar setters y getters en C #; esencialmente, ¿cómo traduciría las mejores prácticas del mundo de Java a C #?
EDITAR
Estaba publicando esto como un comentario a la respuesta de Jon Skeet, pero luego se hizo largo:
¿Qué pasa con una propiedad no trivial (es decir, con un procesamiento y validación significativos tal vez)? ¿Podría todavía exponerlo a través de una propiedad pública pero con la lógica encapsulada en get
y set
? ¿Por qué debería / debería hacer esto en lugar de tener métodos de establecimiento y obtención dedicados (con procesamiento asociado y lógica de validación)?