2012-05-25 9 views
5

Vediamo in questa classe:Perché il campo privato della classe è visibile quando si passa lo stesso tipo di un parametro del metodo 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; 
     } 
    } 

per questo che può accedere a campo privato?

Posso usare questa funzione o potrebbe essere una cattiva pratica?

+0

Questo è di progettazione ed è particolarmente utile per i metodi statici "metodi di fabbrica" ​​e "clone". –

+0

I campi privati ​​sono accessibili all'interno del tipo. ComputeDistanceToOtherClusterCLINK è il membro dello stesso calss. Quindi il campo privato dovrebbe essere accessibile dal corpo del metodo. –

+0

Possibile duplicato di http://stackoverflow.com/questions/8566307/private-field-accessible-from-another-instance-of-the-same-class –

risposta

4

In caso di dubbio, verificare le specifiche della lingua.

Secondo C specifica # lingua, sezione 3.5.1:

3.5.1 dichiarato l'accessibilità

L'accessibilità dichiarata di un membro può essere uno dei seguenti:

  • pubblica , che viene selezionato includendo un modificatore pubblico nella dichiarazione membro. Il significato intuitivo del pubblico è "accesso non limitato".
  • Protetto, che viene selezionato includendo un modificatore protetto nella dichiarazione membro. Il significato intuitivo di protected è "accesso limitato alla classe contenente o ai tipi derivati ​​dalla classe contenente". -Interno, che viene selezionato includendo un modificatore interno nella dichiarazione membro. Il significato intuitivo di interno è "accesso limitato a questo programma".
  • Interno protetto (ovvero protetto o interno), che viene selezionato includendo sia un modificatore protetto che un modificatore interno nella dichiarazione membro. Il significato intuitivo di interno protetto è "accesso limitato a questo programma o tipi derivati ​​dalla classe contenente".
  • Privato, che viene selezionato includendo un modificatore privato nella dichiarazione membro. Il significato intuitivo di privato è "accesso limitato al tipo di contenuto".

Come si può vedere dalla ultima sezione, tutti i metodi della classe contenente (nel tuo caso, è Cluster) hanno accesso al campo privato points.

... e no, questa non è affatto una cattiva pratica: questo è proprio lo scopo dei campi privati!

9

perché posso accedere al campo privato?

Perché ci si trova all'interno della stessa classe in cui è definito il campo privato.

2

Si definisce il campo nell'ambito della classe e quindi le cose all'interno di quella classe possono accedere al campo privato. Questo è un comportamento ben definito e può essere molto utile, non una cattiva pratica di programmazione.

Uno sguardo a Scope può essere utile a voi.

2

La parola chiave private rende il campo privato alla classe, non a un'istanza di oggetto di tale classe. Quindi, qualsiasi codice all'interno di quella classe può accedere a quel campo in qualsiasi oggetto che sia di quel tipo di classe (purché abbia un riferimento all'oggetto, ovviamente). Non è affatto una cattiva pratica farlo.

2

campi privati ​​sono sempre accessibili nel campo di applicazione in cui è definita e poiché variabile privata è definita in ambito di classe quindi è è accessibile.

3

Privato significa privato per l'ambito di classe. Ciò che sorprende è che puoi persino accedere ai campi privati ​​di un altro oggetto della stessa classe.

public class A 
{ 
    private int _i; 

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

Uno dei principali aspetti della OOP (Object Oriented Programming) è l'incapsulamento. Ciò significa che un oggetto vieta l'accesso diretto ai dati privati ​​(campi). Invece fornisce metodi pubblici (inclusi getter di proprietà e setter) per manipolare e accedere ai suoi dati. Ma questo significa anche che questi metodi devono essere in grado di accedere a questi campi privati, altrimenti i campi privati ​​sarebbero completamente inutili.


Precisazione: Ma sono d'accordo, che la possibilità di accedere ai membri privati ​​di un altro oggetto, è inaspettato e, almeno in parte, viola il principio di incapsulamento.

+0

"Completely pointless"? Supponiamo di aver introdotto una parola chiave chiamata 'superprivato' insieme alla specifica che un membro di classe superprivato è accessibile solo attraverso il riferimento' this'. Quindi, se ho detto 'superprivate List punti;' allora questo campo 'points' sarebbe accessibile all'interno di un metodo nella stessa classe, ad esempio per es. 'points.Add (p);' o equivalentemente 'this.points.Add (p)'. Ma secondo le specifiche di 'superprivato', dire' otherCluster.points.Add (p) 'sarebbe illegale. Penso che la parola chiave 'superprivazione' potrebbe essere significativa. È solo più restrittivo di "privato", non inutile. –

+0

Quello che voglio dire è che un campo 'private' (con la definizione effettiva di' private') sarebbe inutile, se non fosse possibile accedere da un metodo della stessa classe, perché nessuno avrebbe mai potuto accedere a questo campo. All'interno dello scopo di una classe, ogni membro di istanza è automaticamente "this.member". –

+0

Questo è corretto. Ma guarda la domanda originale. Lì, 'cluster.points' è diverso da' this.points' perché 'cluster' è (generalmente) un altro oggetto di' this', e le loro liste 'points' saranno (in generale) differenti. Il Poster originale è stato sorpreso dal fatto che fosse corretto dire 'cluster.points' quando' cluster' era un oggetto diverso (da 'this'). Quindi un campo di istanza "privato" può essere visto dal metodo di istanza di un altro oggetto. –

2

I campi privati ​​sono accessibili all'interno del tipo. ComputeDistanceToOtherClusterCLINK è il membro dello stesso calss. Quindi il campo privato dovrebbe essere accessibile dal corpo del metodo.

Problemi correlati