2012-04-24 7 views
7

Considere el siguiente código:¿Cuál es el propósito de este enfoque para acceder a los modificadores?

private string _text = null; 
    private string[] _values = null; 

    public string Text { get { return _text; } } 
    public string[] Values { get { return _values; } } 

¿Qué tiene esto lograr que el tener los miembros del público por sí sola no lo haría?

+7

Tenga en cuenta que debe tener * mucho, mucho cuidado * al exponer una matriz como propiedad de solo lectura de una clase. ** La referencia de matriz es de solo lectura pero los contenidos de la matriz no lo son. ** El usuario de esta clase puede mutar el contenido de la matriz a voluntad. Si eso no es deseable, en su lugar, devuelve un 'ReadOnlyCollection ', no un 'string []'. –

+1

Pensamientos detallados de Eric sobre este tema: http://blogs.msdn.com/b/ericlippert/archive/2008/09/22/arrays-considered-somewhat-harmful.aspx – SolutionYogi

Respuesta

10

Al usar propiedades en lugar de campos públicos, oculta la implementación.

Si en algún momento necesita cambiar las propiedades de texto y valores devueltos, puede cambiar el comportamiento sin cambiar la API de la clase.

Además, este idioma limita el acceso externo a los datos expuestos como de solo lectura.

+2

Se reformuló el asunto del acceso de solo lectura, esperanza que esto es menos ambiguo ¡Gracias a @AdamHouldsworth! –

5

Este código permitiría a las entidades externas leer sus valores, mientras que su código internamente podría modificar el campo de respaldo.

Puede taquigrafía que el uso de auto-propiedades:

public string Text { get; private set; } 
public string[] Values { get; private set; } 

Con un campo público, usted no será capaz de proteger contra la modificación externa y apoyar modificación interna al mismo tiempo.

Incluso si desea exponer un campo como editable externamente, sugeriría encapsular la cosa en una propiedad; nunca se sabe si necesita soportar algo internamente sin romper el contrato externo (código personalizado en el conjunto/obtener te da espacio para hacer esto).

Sin mencionar que la mayoría de los marcos de enlace de datos no ven campos, solo propiedades.

2

_text y solo se pueden establecer dentro de la clase que están definidos, pero se puede acceder a sus valores a través de las propiedades.

6

Es hacer que los valores de sólo lectura, aunque estaría más inclinado a escribir así:

public string Text { get; private set;} 
public string[] Values { get; private set; } 
+3

Esto solo haría que los valores solo se leyeran a cosas fuera de la clase. –

+0

@ AdamHouldsworth No estoy en desacuerdo. – asawyer

+2

Simplemente aclarando porque lanzar palabras como de solo lectura podría confundirse con la palabra clave 'readonly'. –

2

En su ejemplo de su toma de las propiedades como de sólo lectura, pero hay otros usos.

public string Text { get { return _text; } } 

Si quieres hacer alguna operación internamente en el return_text y luego devolverlo contra proeperty Text se puede algo similar.

public string Text { get { return _text.ToUpper(); } } 

Este es el campo Encapsulation

La encapsulación se refiere a veces como el primer pilar o principio de programación orientado a objetos. De acuerdo con el principio de encapsulación, una clase o estructura puede especificar qué tan accesible cada uno de sus miembros es para codificar fuera de la clase o estructura. Los métodos y las variables que no están destinados a ser utilizados desde fuera de la clase o el ensamblaje pueden ocultarse para limitar el potencial de errores de codificación o exploits maliciosos .

Consideremos el siguiente ejemplo:

// private field 
    private DateTime date; 


    // Public property exposes date field safely. 
    public DateTime Date 
    { 
     get 
     { 
      return date; 
     } 
     set 
     { 
      // Set some reasonable boundaries for likely birth dates. 
      if (value.Year > 1900 && value.Year <= DateTime.Today.Year) 
      { 
       date = value; 
      } 
      else 
       throw new ArgumentOutOfRangeException(); 
     } 

    } 

En este ejemplo hay un campo privado date que se expone públicamente a través de la propiedad Date. Ahora, si desea establecer el límite para la fecha, entonces puede ver la parte establecida de la propiedad.

Cuestiones relacionadas