2011-09-15 21 views
13

Hola chicos, ¿hay alguna diferencia entre los dos códigos siguientes? ¿O es la parte superior solo una forma corta de la de abajo?¿Cuál es la diferencia entre prop y full property?

public string Name{get;set;} 

y

private string _Name; 
     public string Name 
     { 
      get { return _Name; } 
      set { _Name=value; } 
     } 
+0

Desde el artículo de MSDN para propiedades automáticas "... el compilador crea un campo de respaldo privado y anónimo al que solo se puede acceder a través de los accesadores get y set de la propiedad" - http://msdn.microsoft.com/en- us/library/bb384054.aspx –

Respuesta

9

La única diferencia (aparte del hecho de que tendría que hacer la inicialización con "Nombre predeterminado" en el constructor de su clase) es que _Name será visible dentro de la misma clase. Existe el riesgo de que la clase haga referencia interna a _Name en lugar de Name, todo funcionará bien, y en algún momento posterior agregará algo de lógica a Name que no se llamará porque está usando _Name dentro de la clase.

Ejemplo:

private string _Name = "Default Name"; 
public string Name 
{ 
    get { return _Name.Left(42); } // Changed the getter 
    set { _Name = value; } 
} 

void MyOtherMethod() 
{ 
    string foo = _Name; // Referencing the private field accidentally instead of the public property. 
    // Do something with foo 
} 
1

es simplemente una forma corta, la variable subyacente es todavía genera como un campo respaldo de soporte (donde se almacenan los datos), pero de forma automática - esto es útil si está literalmente, solo obteniendo y configurando y no necesita ningún detalle de implementación específico en ninguno de los accesorios.

3

No creo que haya ninguna diferencia en el código compilado. La razón por la que puede querer hacer el camino completo es si desea agregar un valor predeterminado (que se puede hacer en el constructor en forma abreviada) o agregar código adicional al getter o al setter

EDITAR: En realidad, su código es incorrecto debe ser

private string _Name; 
public string Name 
{ 
    get { return _Name; } 
    set { _Name = value; }//change here 
} 
no

...

value = _Name; 
1

Para esta implementación particular de la segunda forma, ambos son equivalentes. Porque el compilador generará casi el mismo código si simplemente escribe el primer formulario.

Es decir, el compilador va a agregar el código en él:

public string Name{get;set;} 

haciendo que parezca esto:

private string generatedCode_Name; 
public string Name 
{ 
     get { return generatedCode_Name; } 
     set { generatedCode_Name = value; } 
} 

Por cierto, esto es incorrecto

set { value = _Name; } //I believe its a typo! 

Creo que se refería a:

set { _Name = value; } 
1

Una diferencia es que se puede establecer un defecto en la cadena privada cuando se hace esto

private string _Name = "Default Name"; 
public string Name 
{ 
    get { return _Name; } 
    set { value = _Name; } 
} 

Una vez compilados los dos ejemplos que demostramos son lo mismo.

0

Para el ejemplo como escritas que son un equivalente exacto.

Auto-implemented properties son azúcares sintácticos introducidos para tratar exactamente este tipo de situaciones, donde la propiedad se usa solo para evitar tener un campo público, sin una lógica extra en el getter/setter. Sin embargo, una propiedad implementada automáticamente le brinda todos los beneficios de las propiedades, incluidos los metadatos.Aquí hay un más bien old but still relevant link que explica un poco más sobre ellos.

Detrás de escena, el compilador genera un campo de respaldo muy similar al suyo.

3

El comportamiento básico y el propósito del método de propiedad es casi el mismo. Pero la mayor diferencia radica en la implementación. La diferencia entre

public string Name{get;set;} 

Y

private string _Name; 
     public string Name 
     { 
      get { return _Name; } 
      set { _Name=value; } 
     } 

es si utiliza sintaxis de la propiedad corta (introducido en Framework 3.0 o posterior), entonces la picadura de propiedad nunca se ha inicializado es decir, si se utiliza directamente propiedad "Name" en cualquier lugar sin establecer el valor, devolverá un valor NULL. Pero si usa una segunda sintaxis para inicializar el valor de la propiedad, devolverá una cadena VACÍA porque cuando inicializa una cadena, se inicializa con un valor EMPTY no el NULL. Por lo tanto, si devuelve el valor de la propiedad sin inicializar utilizando el método de propiedad FULL, siempre devolverá la cadena VACÍA no el valor NULL.

Cuestiones relacionadas