2011-09-06 11 views
10

Eventuali duplicati:
Why are my privates accessible?
Why are private fields private to the type, not the instance?Perché i membri privati ​​di un'istanza di classe sono disponibili nel corpo del metodo Equals()?

Molto probabilmente mi manca un fatto ovvio, ma non può veramente vedere la ragione:

Quando ho sovrascrivere l'Equals () metodo e quando lancio l'oggetto sul mio tipo, sono in grado di chiama il i suoi membri privati ​​ senza alcun problema !!!

Sto inizializzando un'istanza e mi aspetto che i suoi membri privati ​​non siano raggiungibili.

Ma perché l'oggetto casted apre i suoi elementi personali nel metodo Equals()?

vedere l'implementazione Equals sul codice di esempio e vedere come sto raggiungendo i campi privati ​​sul "che" istanza:

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

Hai provato a modificare queste variabili, per cambiarne il valore, a freddo ti prego di provarlo e rispondi se funziona o meno. – Burimi

risposta

17

membri privati ​​sono privati ​​di una classe, non un'istanza.

All'interno della classe Animal, è possibile accedere a qualsiasi membro privato di qualsiasi istanza di Animal a cui si è passati (o, in questo caso, trasmettere correttamente a).

+5

Per chiarire l'OP, questo comportamento non ha nulla a che fare con il metodo 'Equals()'; non è speciale in questo senso. Qualsiasi metodo definito su 'Animal' (compresi i metodi statici) può accedere ai membri privati ​​su qualsiasi oggetto' Animale' che gli viene dato. – cdhowie

1

Perché public override bool Equals(object obj) fa parte della classe Animal.

Forse ti stai confondendo perché stavi pensando che lo Equals fosse un membro statico di Animal e, in questo modo, non fosse in grado di vedere i membri privati ​​di Animal. O forse non xD.

+1

Questo comportamento non ha nulla a che fare con la staticità del metodo. – cdhowie

+0

In effetti non è così. Si tratta di lanciare un oggetto estraneo alla classe Animale e di essere in grado di vedere i suoi membri privati, anche di essere un oggetto esterno (ma all'interno della classe Animale, e quindi di poter vedere i suoi membri privati, anche se l'oggetto non è un "Animale"). Stavo solo cercando di indovinare perché il sig. @pencilCake era confuso. – Canella

Problemi correlati