2011-09-06 8 views
10

Duplicar posibles:
Why are my privates accessible?
Why are private fields private to the type, not the instance?¿Por qué los miembros privados de una instancia de clase están disponibles en el cuerpo del método Equals()?

Lo más probable es que me falta un hecho evidente, pero realmente no puedo ver la razón:

Cuando sobrescribir los métodos equals () método y cuando echo el objeto a mi tipo, soy capaz de llame a es miembros privados sin ningún problema!

Estoy inicializando una instancia y espero que sus miembros privados no sean accesibles.

¿Pero por qué el objeto casted me abre sus partes privadas en el método Equals()?

Ver la implementación Iguales en el código de ejemplo siguiente y ver cómo Estoy llegando a los campos privados en el "que" ejemplo:

public class Animal 
{ 
    private string _name; 
    private int _age; 

    public Animal(int age, string name) 
    { 
     _name = name; 
     _age = age; 
    } 

    public override bool Equals(object obj) 
    { 
     var that = (Animal) obj; 


     //_name and _age are available on "that" instance 
     // (But WHY ???) 
     return 
      this._age == that._age 
      && this._name == that._name; 

    } 
} 


    class Program 
    { 
     static void Main(string[] args) 
     { 
      var cat1 = new Animal(5, "HelloKitty"); 
      var cat2 = new Animal(5, "HelloKitty"); 

      Console.Write(cat1.Equals(cat2)); 
      Console.Read(); 
     } 
    } 
+0

Ha intentado modificar estas variables, para cambiar su valor, frío, por favor intente y responda si está funcionando o no. – Burimi

Respuesta

17

Los miembros privados son privados para una clase, no a una instancia.

Dentro de la clase Animal, puede acceder a cualquier miembro privado de cualquier instancia de Animal que se le pase (o, en este caso, se lo haya enviado correctamente).

+5

Para aclarar el OP, este comportamiento no tiene nada que ver con el método 'Equals()'; no es especial en este sentido. Cualquier método definido en 'Animal' (incluidos los métodos estáticos) puede acceder a miembros privados en cualquier objeto' Animal' que se le dé. – cdhowie

1

Debido public override bool Equals(object obj) es parte de la clase Animal.

Quizás esté confundido porque pensaba que el Equals era un miembro estático de Animal y, de esta manera, no podía ver a los miembros privados de Animal. O tal vez no xD.

+1

Este comportamiento no tiene nada que ver con la estática del método. – cdhowie

+0

De hecho, no es así. Se trata de enviar un objeto externo a la clase Animal y poder ver sus miembros privados, incluso siendo un objeto externo (pero dentro de la clase Animal, y así poder ver sus miembros privados, incluso si el objeto no es un 'Animal') Solo intentaba adivinar por qué mr. @pencilCake estaba confundido. – Canella

Cuestiones relacionadas