Pregunta

He visto a la mayoría de la gente usar variables miembro en una clase como:

string _foo;
public string foo { get { return _foo; }; private set { _foo = value}; }

¿Pero cuál es la diferencia de eso a esto?

public string foo { get; private set; }
¿Fue útil?

Solución

En casos simples, es igual que es lo mismo, pero en casos más complejos en los que incendió los eventos o algo que necesita un código adicional en la entrada y se establece para que necesite el miembro ex:

private string _name;
public string Name
{
   get{ return _name; }
   set
   {
      SomeHandler("Name", value);
      _name = value;
   }
}

Otros consejos

Mientras la implementación de la propiedad en realidad no haga nada más que obtener y establecer, la diferencia es bastante menor.Las razones para usarlo pueden ser:

  • Código heredado anterior a C# 3.0 (que agregaba propiedades automáticas, es decir.el public string Name { get; set; } sintaxis.
  • Esperando tener que cambiar la implementación del getter/setter en algún momento.
  • Requisitos para alguna serialización personalizada.
  • Usar el campo subyacente en el código por cualquier motivo.Un buen ejemplo podría ser utilizar el campo de respaldo como ref parámetro a algún método.Esto también incluye cosas como usar el valor en interoperabilidad nativa (GCHandle etc.).
  • Preferencia de usuario sencilla.Normalmente no uso propiedades automáticas porque me gusta especificar los campos de respaldo manualmente.
  • Usando un readonly El campo de respaldo es imposible cuando se utilizan propiedades automáticas.

Esto es sólo la punta del iceberg.También hay toneladas de razones extrañas, por ejemplo, tener que declarar el campo explícitamente para que alguien pueda acceder a él mediante la reflexión, por cualquier motivo.

Antes de la introducción de "Propiedades automáticas", debemos usar un poco de "campo de respaldo" para las proporencias.La mayoría de las veces, las proporaciones simplemente devolverán el valor / establecer el valor al "campo de respaldo" como en el siguiente ejemplo.

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

Con la introducción de 'propiedades automáticas' podemos simplemente ignorar el 'campo de respaldo' (o no necesitamos suministrar uno).Esto es en su mayoría adecuado si su diseño es como el ejemplo anterior, pero si necesita hacer cumplir algunos "especie" de la lógica personalizada al recuperar el valor o antes de configurar el valor, todavía necesitamos seguir el 'Buen diseño antiguo' (es decir, conel campo de respaldo)

Diferente escenario da varias ventajas.

string _FirsName;   
string _LastName;   

public string FullName 
{ 
   get 
   { 
      return _FirsName + _LastName;
   }
   set; 
} 

public string ReverseName 
{ 
   get 
   { 
      return _LastName + ", " + _FirsName;
   }
   set; 
}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top