2012-05-25 4 views
5

Vamos a ver en esta clase:¿Por qué el campo privado de la clase es visible al pasar el mismo tipo como un parámetro del método C#?

public class Cluster 
    { 
     private List<Point> points; //private field 

     public float ComputeDistanceToOtherClusterCLINK(Cluster cluster) 
     { 
      var max = 0f; 
      foreach (var point in cluster.points) // here points field are accessible 
      { 
        ....... 
      } 
      return max; 
     } 
    } 

razón por la que puede acceder ámbito privado?

¿Puedo usar esta característica o puede ser una mala práctica?

+0

Esto es por diseño y es particularmente útil para métodos estáticos de "métodos de fábrica" ​​y "clonar". –

+0

Los campos privados son accesibles dentro del tipo. ComputeDistanceToOtherClusterCLINK es el miembro del mismo calss. Entonces el campo privado debería ser accesible desde el cuerpo del método. –

+0

Posible duplicado de http://stackoverflow.com/questions/8566307/private-field-accessible-from-other-instance-of-the-same-class –

Respuesta

4

En caso de duda, verifique las características del idioma.

Según denominación del lenguaje C#, la sección 3.5.1:

3.5.1 accesibilidad Declarado

La accesibilidad declarada de un miembro puede ser uno de los siguientes:

  • Pública , que se selecciona al incluir un modificador público en la declaración del miembro. El significado intuitivo de público es "acceso no limitado".
  • Protegido, que se selecciona al incluir un modificador protegido en la declaración del miembro. El significado intuitivo de protected es "acceso limitado a la clase contenedora o tipos derivados de la clase contenedora". -Interno, que se selecciona al incluir un modificador interno en la declaración del miembro. El significado intuitivo de interno es "acceso limitado a este programa".
  • Protegido interno (es decir, protegido o interno), que se selecciona al incluir un modificador tanto protegido como interno en la declaración del miembro. El significado intuitivo de interno protegido es "acceso limitado a este programa o tipos derivados de la clase contenedora".
  • Privado, que se selecciona incluyendo un modificador privado en la declaración del miembro. El significado intuitivo de privado es "acceso limitado al tipo que lo contiene".

Como se puede ver en la última sección, todos los métodos de la clase que contiene (en su caso, es Cluster) tienen acceso al campo privado points.

... y no, esto no es una mala práctica en absoluto: ¡este es precisamente el propósito de los campos privados!

9

¿Por qué puedo acceder al campo privado?

Porque se encuentra dentro de la misma clase en la que se define el campo privado.

2

Defina el campo dentro del alcance de la clase y, por lo tanto, las cosas dentro de esa clase pueden acceder al campo privado. Este es un comportamiento bien definido y puede ser muy útil, no una mala práctica de programación en absoluto.

Un vistazo a Scope puede ser útil para usted.

2

La palabra clave privada hace que el campo sea privado para la clase, no para una instancia de objeto de esa clase. Entonces, cualquier código dentro de esa clase puede acceder a ese campo en cualquier objeto que sea del tipo de esa clase (siempre que tenga una referencia al objeto, por supuesto). No es en absoluto una mala práctica hacerlo.

2

campos privados son siempre accesibles en el ámbito en el que es definido y puesto variable privada se define en el ámbito de la clase de ahí que es accesible.

3

Privado significa privado para el alcance de la clase. Lo que es sorprendente es que incluso puede acceder a los campos privados de otro objeto de la misma clase.

public class A 
{ 
    private int _i; 

    public bool AreEqual(A otherObject) 
    { 
     return this._i == otherObject._i; 
    } 
} 

Uno de los principales aspectos de la OOP (Programación Orientada a Objetos) es la encapsulación. Esto significa que un objeto prohíbe el acceso directo a datos privados (campos). En su lugar, proporciona métodos públicos (incluidos captadores de propiedades y definidores) para manipular y acceder a sus datos. Pero esto también significa que estos métodos deben poder acceder a estos campos privados, de lo contrario los campos privados serían completamente inútiles.


Aclaración: Pero estoy de acuerdo, que la posibilidad de tener acceso a los miembros privados de otro objeto, es inesperado y, al menos parcialmente, viola el principio de encapsulación.

+0

"Completamente inútil"? Supongamos que introduje una palabra clave llamada 'superprivate' junto con la especificación de que un miembro de clase superprivado solo está accesible a través de la referencia' this'. Entonces, si dije 'lista superprivada puntos;' entonces este campo 'points' sería accesible dentro de un método en la misma clase, diciendo, p. 'points.Add (p);' o equivalentemente 'this.points.Add (p)'. Pero de acuerdo con la especificación de 'superprivate', decir' otherCluster.points.Add (p) 'sería ilegal. Creo que la palabra clave 'superprivate' podría ser significativa. Es simplemente más restrictivo que 'privado ', no tiene sentido. –

+0

Lo que quiero decir es que un campo 'privado' (con la definición real de 'privado') no tendría sentido, si no se pudiera acceder desde un método de la misma clase, porque entonces nadie podría acceder a este campo. Dentro del alcance de una clase, cada miembro de instancia es automáticamente 'this.member'. –

+0

Eso es correcto. Pero mira la pregunta original. Allí, 'cluster.points' es diferente de' this.points' porque 'cluster' es (generalmente) otro objeto que' this', y sus listas 'points' (en general) serán diferentes. El Póster original se sorprendió de que estaba bien decir 'cluster.points' cuando' cluster' era un objeto diferente (de 'this'). Por lo tanto, un campo de instancia "privada" se puede ver mediante el método de instancia de otro objeto. –

2

Los campos privados son accesibles dentro del tipo. ComputeDistanceToOtherClusterCLINK es el miembro del mismo calss. Entonces el campo privado debería ser accesible desde el cuerpo del método.

Cuestiones relacionadas