Estoy tomando una clase C# en este momento y estoy tratando de encontrar la mejor manera de hacer las cosas. Vengo de un entorno Java y, por lo tanto, solo estoy familiarizado con las mejores prácticas de Java; ¡Soy un novato de C#!Buenas prácticas de getters, setters y properties. Java vs. 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 hacerlo.
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 debo usar, y lo son las advertencias o sutilezas involucradas con cada enfoque? Al crear clases, sigo las mejores prácticas generales que conozco de Java (especialmente la lectura de Java efectivo). Entonces, por ejemplo, estoy a favor de la inmutabilidad (que proporciona setters solo cuando es necesario). Tengo curiosidad por ver cómo estas prácticas se ajustan a 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 fijando esto como un comentario a la respuesta de Jon Skeet, pero luego se puso de largo:
¿Qué hay de una propiedad no trivial (es decir, con un procesamiento significativo y validación tal vez)? ¿Podría seguir exponiéndolo 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 sobre tener métodos dedicados setter y getter (con lógica de procesamiento y validación asociada).
Más exactamente: cualquier reiew código señalará la forma en java es un truco que está pasando por alto langauge válido y tiempo de ejecución (!) construye y mata el uso de la propiedad como proeprty (es decir, object.property = "value"). En algunos equipos, esto daría lugar a una agradable charla sobre la actitud, dependiendo de la antigüedad combinada con un incentivo para poner esa actitud al uso de un competidor. En serio, NO LUCHES LA LANGAUGE. Especialmente como el "camino" de Java es un truco que se eligió para no modificar el lenguaje para el soporte de bienes inmuebles. – TomTom
Supongo que la buena noticia es que mi respuesta no parece contradecir nada de lo que ha mencionado. La mala noticia es que tus dedos son mucho más rápidos que los míos. Gran idea y gracias por los detalles adicionales. – jeremyalan
Para responder a la edición: puede usar los métodos get/set con la cantidad de lógica que desee. A menudo hacemos esto, especialmente para la validación.La mejor práctica, sin embargo, no es tener mucha lógica lenta (acceso a la base de datos, por ejemplo), lógica peligrosa (lanzamiento de excepción) o mutación (cambiando mucho estado) en las propiedades. Se espera que una propiedad actúe más o menos como un estado simple. Cualquier cosa más debería indicarse usando una función en su lugar. – CodexArcanum