c# - getter y setter java netbeans
Getters, setters y mejores prácticas de propiedades. Java vs. C# (11)
Como se mencionó, todos estos enfoques resultan en el mismo resultado. Lo más importante es elegir una convención y aferrarse a ella. Prefiero usar los dos últimos ejemplos de propiedades.
Estoy tomando una clase de C # en este momento y estoy tratando de descubrir 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 #!
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 debería usar y cuáles son las salvedades 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 publicando esto como un comentario a la respuesta de Jon Skeet, pero luego fue largo:
¿Qué pasa con una propiedad no trivial (es decir, con un procesamiento y validación significativos 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).
En C # favorece las propiedades para exponer campos privados para get y / o set. La forma que mencionas es una propiedad automática donde get y set generan automáticamente un campo de respaldo de pivote oculto para ti.
Yo prefiero las propiedades automáticas cuando sea posible, pero nunca debes hacer un par de método set / get en C #.
En C # la forma preferida es a través de las propiedades en lugar de los getX()
y setX()
. Además, tenga en cuenta que C # no requiere que las propiedades tengan tanto un get como un set; puede tener propiedades de solo obtener y propiedades de solo ajuste.
public boolean MyProperty
{
get { return something; }
}
public boolean MyProperty
{
set { this.something = value; }
}
Independientemente de qué camino elija en C #, el resultado final es el mismo. Obtendrá una variable de respaldo con métodos getter y setter separados. Al usar las propiedades, está siguiendo las mejores prácticas, por lo que es una cuestión de qué tan detallado desea obtener.
Personalmente elegiría auto-propiedades, la última versión: public string Name { get; set; }
public string Name { get; set; }
public string Name { get; set; }
, ya que ocupan la menor cantidad de espacio. Y siempre puede expandir estos en el futuro si necesita agregar algo como validación.
Primero déjame intentar explicar lo que escribiste:
// private member -- not a property
private string name;
/// public method -- not a property
public void setName(string name) {
this.name = name;
}
/// public method -- not a property
public string getName() {
return this.name;
}
// yes it is property structure before .Net 3.0
private string name;
public string Name {
get { return name; }
set { name = value; }
}
Esta estructura también se usa hoy en día, pero es más adecuada si desea realizar alguna funcionalidad adicional, por ejemplo, cuando se establece un valor, puede analizarlo para capitalizarlo y guardarlo en un miembro privado para uso interno alterno.
Con .NET Framework 3.0
// this style is introduced, which is more common, and suppose to be best
public string Name { get; set; }
//You can more customize it
public string Name
{
get;
private set; // means value could be set internally, and accessed through out
}
Te deseo mejor suerte en C #
Si todo lo que necesita es una variable para almacenar algunos datos:
public string Name { get; set; }
¿Quieres que parezca de solo lectura?
public string Name { get; private set; }
O mejor...
private readonly string _name;
...
public string Name { get { return _name; } }
¿Desea realizar algún control de valor antes de asignar la propiedad?
public string Name
{
get { return m_name; }
set
{
if (value == null)
throw new ArgumentNullException("value");
m_name = value;
}
}
En general, GetXyz () y SetXyz () solo se usan en ciertos casos, y solo tiene que usar el intestino cuando se sienta bien. En general, diría que espero que la mayoría de las propiedades get / set no contengan mucha lógica y tengan muy pocos efectos secundarios inesperados. Si leer un valor de propiedad requiere invocar un servicio o recibir información de un usuario para construir el objeto que estoy solicitando, entonces lo envolvería en un método y lo llamaría algo así como BuildXyz()
, en lugar de GetXyz()
.
Siempre que sea posible, prefiero string Name { get; set; }
pública string Name { get; set; }
string Name { get; set; }
string Name { get; set; }
ya que es escueto y fácil de leer. Sin embargo, puede haber momentos en que este sea necesario
private string name;
public string Name {
get { return name; }
set { name = value; }
}
Usa las propiedades en C #, no en los métodos get / set. Están ahí para su conveniencia y es idiomático.
En cuanto a sus dos ejemplos de C #, uno es simplemente azúcar sintáctica para el otro. Use la propiedad auto si todo lo que necesita es un simple contenedor alrededor de una variable de instancia, use la versión completa cuando necesite agregar lógica en el getter y / o setter.
como la mayoría de las respuestas aquí, usa propiedades automáticas. Intuitivo, menos líneas de código y es más limpio. Si debe serializar su clase, marque la clase [Serializable]
/ con el atributo [DataConract]
. Y si usa [DataContract]
marque al miembro con
[DataMember(Name="aMoreFriendlyName")]
public string Name { get; set; }
El colocador privado o público depende de tu preferencia.
También tenga en cuenta que las propiedades automáticas requieren tanto getters como setters (públicos o privados).
/*this is invalid*/
public string Name
{
get;
/* setter omitted to prove the point*/
}
Alternativamente, si solo quiere obtener / configurar, cree un campo de respaldo usted mismo
Pre-C # 6
Usaría el último de estos, por una propiedad trivial. Tenga en cuenta que llamaría esto una propiedad pública ya que tanto los getters como los setters son públicos.
La inmutabilidad es un poco molesta con las propiedades implementadas automáticamente: no se puede escribir una propiedad automática que solo tenga un getter; lo más cerca que puede venir es:
public string Foo { get; private set; }
que no es realmente inmutable ... solo inmutable fuera de tu clase. Por lo tanto, es posible que desee utilizar una propiedad real de solo lectura en su lugar:
private readonly string foo;
public string Foo { get { return foo; } }
Definitivamente no desea escribir getName()
y setName()
. En algunos casos, tiene sentido escribir métodos Get / Set en lugar de usar propiedades, particularmente si pueden ser costosas y desea enfatizar eso. Sin embargo, querría seguir la convención de nomenclatura .NET de PascalCase para conocer los métodos, y no querría que una propiedad trivial como esta se implementara con los métodos normales de todos modos, una propiedad es mucho más idiomática aquí.
C # 6
Hooray, finalmente tenemos propiedades apropiadas de solo lectura implementadas automáticamente:
// This can only be assigned to within the constructor
public string Foo { get; }
Del mismo modo, para las propiedades de solo lectura que sí necesitan algún trabajo, puede usar las propiedades de miembros del cuerpo:
public double Area => height * width;
public string Name { get; set; }
Esto es simplemente una propiedad implementada automáticamente , y es técnicamente lo mismo que una propiedad normal. Se creará un campo de respaldo al compilar.
Todas las propiedades se convierten eventualmente en funciones, por lo que la implementación compilada real al final es la misma a la que está acostumbrado en Java.
Utilice las propiedades implementadas automáticamente cuando no tenga que realizar operaciones específicas en el campo de respaldo. Utilice una propiedad ordinaria de lo contrario. Use las funciones get y set cuando la operación tenga efectos secundarios o sea computacionalmente costosa, use propiedades de lo contrario.