2011-10-11 12 views
5

Eventuali duplicati:
Why are private fields private to the type, not the instance?Perché è possibile chiamare un metodo/variabile CSharp protetto o privato?

Si consideri la seguente classe:

public class Test 
{ 
    protected string name; 
    private DateTime dateTime; 

    public Test(string name) 
    { 
     this.name = name; 
     this.dateTime = DateTime.Now; 
    } 

    public Test(Test otherObject) 
    { 
     this.name = otherObject.name; 
     this.dateTime = otherObject.GetDateTime(); 
    } 

    private DateTime GetDateTime() 
    { 
     return dateTime; 
    } 

    public override string ToString() 
    { 
     return name + ":" + dateTime.Ticks.ToString(); 
    } 
} 

Nel mio costruttore Chiamo privato o protetta roba del otherObject . Perché è possibile? Ho sempre pensato che privato fosse realmente privato (implicando solo che l'oggetto potesse chiamare quel metodo/variabile) o protetto (accessibile solo da sovraccarichi).

Perché e quando dovrei usare una funzione come questa?

C'è qualche principio OO/principio che mi manca?

+1

Perché si è ottenuto un voto negativo? Sembra una buona domanda con un buon esempio di codice (che devo ammettere non ho ancora testato, ma suppongo che fa ciò che si sostiene? – Chris

+0

anche http://stackoverflow.com/questions/4244818/why-can-private-member- variabile-essere-cambiato-by-classe-istanza – AakashM

+0

e http://stackoverflow.com/questions/2090285/c-private-members-visibility – AakashM

risposta

5

Da MSDN (Riferimenti per C#)

La parola chiave privata è un modificatore di accesso utente. L'accesso privato è il livello di accesso meno permissivo . I membri privati ​​sono accessibili solo all'interno del corpo della classe o della struttura in cui sono dichiarati.

1

I modificatori di accesso sono determinati dalla classe, non dall'oggetto. Se si accede a testObject da metodi di un'altra classe, la stessa cosa sarebbe impossibile.

L'esempio banale per l'utilizzo di questo è il metodo Clone(), in cui è necessario accedere ad altre parti private degli oggetti per creare una copia.

1

Privato significa che è possibile accedervi solo tramite codice nella stessa classe. Questo è il caso qui. Hai un'altra istanza, ma è la stessa classe.

2

Si sta comportando esattamente come per la specifica C#. (E 'anche il modo in Java determina l'accessibilità.)

accesso è applicata dal tipo di esprimere si sta accedendo, non il identità dell'oggetto che si sta accedendo.

Per quanto riguarda quando è utile: confrontare due oggetti dello stesso tipo, clonazione, ecc. È utile non dover esporre pubblicamente tutti i dettagli quando si "fidano" del codice nella stessa classe.

2

È privato per altre classi non per istanze di oggetti e, pertanto, poiché si è nella stessa classe, è possibile accedere ai metodi privati.

Si può usare per oggetto la clonazione per esempio

3

Per rispondere alla tua domanda:

È possibile utilizzare che, per esempio in un metodo Clone. Dove è necessario l'accesso in scrittura ai membri che possono essere esposti in sola lettura.Mi piace

class MyClass : ICloneable 
{ 
    public object Clone() 
    { 
     var clone = (MyClass)MemberwiseClone(); 
     clone.Value = this.Value; // without the way private works, this would not be possible 
     return clone; 
    } 

    public int Value{ get; private set;} 
} 
+0

Sì, che avrebbe senso! –

Problemi correlati