2009-10-27 20 views
12

Wie kann dieser Code kompilieren? Der folgende Code im Operator int kann auf eine private Variable der Klasse MyValue zugreifen. Warum?Zugriff auf private Member eines Parameters innerhalb einer statischen Methode?

class Program 
{ 
    static void Main(string[] args) 
    { 
     Myvalue my = new Myvalue(100); 
     Console.WriteLine(my + 100); 
     Console.Read(); 
    } 
} 


public class Myvalue 
{ 
    private int _myvalue; 

    public Myvalue(int value) 
    { 
     _myvalue = value; 
    } 

    public static implicit operator int(Myvalue v) 
    { 
     return v._myvalue; 
    } 
} 

Antwort

18

Da es in der Klasse ist, hat es Zugriff auf private Variablen darin. Genau wie Ihre Instanz öffentliche Methoden. Es funktioniert auch umgekehrt. Sie können auf private statische Member von Instanzmembern zugreifen, um ein Monostate-Muster zu erstellen.

+0

Wenn die Klasse statisch gewesen wäre, hätte ich das verstanden. Aber da das Objekt an Parameter übergeben wird, warum benötigt es keinen Accessor? –

+3

@Daok: Weil Ihre statische Methode ein Mitglied der Klasse ist. Wenn diese statische Methode irgendwo anders wäre, wäre das nicht erlaubt. –

+0

Alles klar, danke für die Präzision. –

5

operator int() ist immer noch eine Memberfunktion der MyValue-Klasse und kann daher auf alle Felder von Objekten vom Typ MyValue zugreifen.

Beachten Sie, dass die statische bedeutet nur, dass ein MyValue-Objekt an die Funktion als Parameter übergeben werden muss.

14

Die private bedeutet privat für die Klasse und nicht privat für die Instanz.

+2

+1 - Gut gesagt, präzise und markig! – Nate

+1

+1 in der Tat: http://stackoverflow.com/questions/888224/what-is-your-longest-held-programming-assumption-that-turned-out-to-be-incorrect/888246#888246 –

+1

Hum, nicht privat für die Instanz? Ich denke, es ist falsch, weil ich nicht verwenden kann: Myvalue my = new Myvalue (100); mein._Myvalue = 1; Weil die Instanz "mein" nicht auf private Variable zugreifen kann. –

Verwandte Themen