2010-02-12 8 views
7

Veo esto todo el tiempo:¿Por qué usa variables privadas con C# getter/setters?

private int _myint; 

    public int MyInt 
    { 
     get 
     { 
      return _myint; 
     } 
     set 
     { 
      _myint = value; 
     } 
    } 

Esto me parece idéntica a:

public int MyInt{ get; set; } 

Entonces, ¿por qué todo el mundo hacer lo primero ... ¿POR EL VAR privado en todos ?!

+6

Hay una variable privada en * ambos * casos, sin embargo en el segundo caso es generada por el compilador. –

Respuesta

31

En primer lugar, esto es nuevo en C# 3.0, no existía antes. En segundo lugar, si desea agregar cualquier lógica personalizada a su getter y setters, no tiene otra opción. Así que sí, en su ejemplo donde no hay una lógica personalizada, es lo mismo (de hecho, el compilador genera eso para usted detrás de las escenas) pero si quiere plantear un evento, por ejemplo, o algo así, debe ser explícito al respecto.

+3

ejemplo perfecto de a lo que se refiere BFree para eventos es en MVVM, donde necesita subir PropertyChanged para hacer que la GUI refleje el nuevo valor de enlace de datos. – Dave

4

En primer lugar, la sintaxis que utilizó es nueva. No existía en versiones anteriores de C#.

En segundo lugar, necesita la variable privada si va a tener un valor predeterminado, o lazy-load el resultado.

2

¿Te gusta alguien que no conoces jugando con tus partes privadas? Espero que no. Esta es una forma de proporcionar lo que es esencialmente un proxy para algo que usted posee pero sobre el cual no desea ceder el control. Si decide que quiere validar que las int son positivas, puede comenzar a hacerlo si codifica como se muestra.

C# hace esto transparente ahora con propiedades automáticas.

2

Antes de C# 3, esa era la única forma de hacerlo. Las propiedades implícitamente tipadas todavía no estaban disponibles. La gente todavía quería abstraer el miembro privado. Si los desarrolladores siguen haciendo esto en C# 3, o bien no están al tanto de los nuevos cambios o necesitan proporcionar una lógica de obtención/configuración personalizada.

1
public int MyInt{ get; set; } 

fue una característica añadida en C# 3.0 llamado Propiedades automáticas. C# 2.0 no es compatible con esto y requiere la variable privada con los getters y setters explícitos. Por lo tanto, una gran cantidad de código antiguo o código compatible con versiones anteriores usarán los getters y setters explícitos.

2

Esa es la forma antigua de hacerlo. De la forma que prefiera ("propiedades automáticas") es una construcción relativamente nueva en el lenguaje. Hace algunos años, siempre tuvimos que usar variables privadas.

También puede haber otras razones para usar variables privadas, aunque no en el ejemplo simple que usted proporciona. Si, por ejemplo, necesitara inicializar la propiedad con un valor predeterminado, no puede hacer eso limpiamente con propiedades automáticas; en su lugar, debe inicializar en los constructores.

6

me gustaría ver

public int MyInt{ get; private set; } 

más,;)

pero @BFree clavé

+0

¿cómo podría hacer el "conjunto privado" en esa clase? – herzmeister

+0

@hdw: puede configurarlo en la clase, simplemente no puede configurarlo desde fuera de la clase. – Steve

+0

Utilizo ese patrón mucho en el caso de las clases en las que tengo 'propiedades de volcado'; sin embargo, como se menciona en otras respuestas, la propiedad automática excluye cualquier lógica personalizada que pueda necesitarse durante la obtención o el conjunto. –

1

Si nos fijamos en la salida producida por el compilador con una herramienta como un reflector ámbito privado se ha añadido

4

Un ejemplo para ampliar lo que está diciendo @BFree:

private int _Whatever; 
public int Whatever 
{ 
    get {return _Whatever;} 
    set 
    { 
     if(value != _Whatever) 
     { 
      // It changed do something here... 
      // maybe fire an event... whatever 

     } 

     _Whatever = value; 

    } 
} 
Cuestiones relacionadas