Warum sollten Sie nicht über eine Instanzvariable auf ein freigegebenes / statisches Member zugreifen?

8

Hier ist ein Beispiel von dem, worüber ich spreche ...

%Vor%

Me.MyValue gibt eine Warnung in VB.NET und (der entsprechende Code gibt) einen Fehler in C #. Gibt es einen besonderen Grund dafür? Ich finde es intuitiver / natürlicher, auf die gemeinsame Funktion mit 'Me.MyValue' zuzugreifen - aber ich vermeide es, meine Warnungen auf 0 zu halten.

Hat jemand anderes gerade entschieden, "Nah, es macht mehr Sinn, es anders zu machen" oder gibt es einen technischen Grund, den ich nicht verstehe?

BEARBEITEN:

Danke allen. Ich dachte daran falsch, mehr wie eine "Unterklasse" in OOP. Auch wenn in der Basisklasse etwas deklariert ist, greifen Sie über die vorhandene Instanz darauf zu. Aber diese Beziehung ist nicht identisch mit geteilten oder statischen.

    
Rob P. 03.03.2011, 15:58
quelle

6 Antworten

7

Statische Member werden definitionsgemäß auf der Ebene class deklariert, nicht auf Instanzebene. Daher ist das Zugreifen auf ein statisches Member mit this (oder me in VB) nicht richtig (und stimmt nicht in C #)

Wenn Sie this.something (oder me.something ) angeben, bedeutet dies, dass Sie auf "etwas" zugreifen, das für diese bestimmte Instanz spezifisch ist, während statische Elemente wiederum in allen all Instanzen dieser Klasse geteilt werden.

    
Adam Rackis 03.03.2011, 16:00
quelle
3

Es ist irreführend für den Leser Ihres Codes.

Code sollte so geschrieben sein, dass er von einem anderen Programmierer gelesen und verstanden werden kann, der nicht jedes Detail des Projekts kennt. Wenn Sie auf eine statische Variable über eine Instanz zugreifen, sieht diese wie ein Instanzmember aus - Sie müssten die Deklaration überprüfen, um zu sehen, dass Sie sich irren.

Dieser "andere Programmierer" könnte genauso gut nach einem halben Jahr sein.

    
peterchen 03.03.2011 16:05
quelle
2

Me zeigt auf die aktuelle Instanz von Sample1 , während MyValue selbst zur Klasse gehört. Daher erscheint es mir in Ordnung, dass VB.NET Sie warnt.

Übrigens, Java macht es auf die gleiche Weise:

%Vor%

Prost Matthias

    
Matthias Meid 03.03.2011 16:02
quelle
2

Die statische members/methods arbeitet bei class level (d. h. Verhalten, das unabhängig von einer Objektinstanz ist) und object's members/methods arbeitet bei instance level , sodass sie zwei verschiedene Identitäten haben:  - Ссылка

    
Kumar 03.03.2011 16:07
quelle
1

Mehr als wahrscheinlich schützt der Compiler Sie davor, einen Fehler zu machen, wenn Sie eine Instanz und ein statisches Member mit demselben Namen haben.

%Vor%

ergibt:

  • Statisch
  • Statisch
  • Instanz
Kieron 03.03.2011 16:05
quelle
1

Sie können nicht auf Felder auf Klassenebene nach this reference zugreifen, und Sie können nicht auf Objektebenenfelder zugreifen, die nach Klassenreferenz sinnvoll sind.

Wenn Sie nach this pointer auf das Klassen-Level-Feld zugreifen würden, könnten Sie folgenden seltsamen Code erhalten:

%Vor%

was jemanden in die Irre führen könnte, dass wir tatsächlich verschiedene Eigenschaften oder Felder bearbeiten, aber wenn sie Zugriff auf den Klassennamen haben

%Vor%

es ist klar, dass wir die gleiche Sache bearbeiten.

Auch im Speicher werden statische Felder an einem völlig anderen Ort (in der Nähe von Type object) gespeichert als Objektfelder, daher denke ich, dass es super klar ist.

Die eigentliche Frage ist - warum ist es kein Fehler in VB.NET? Ich würde vermuten, dass die Antwort ist, dass VB einige der alten .NET-VB-Funktionen erbte, die nicht sehr typsicher waren, und es ist ein seltsames Ergebnis einer solchen Vererbung.

    
Valentin Kuzub 03.03.2011 16:07
quelle

Tags und Links