WICHTIGES UPDATE (12. April 2016):
Wir wurden darauf aufmerksam gemacht, dass der interne Standard des .NET CoreFX-Teams darauf besteht, die Unterstrich-Notation zu verwenden, ohne Aufschluss darüber zu geben, warum. Aber wenn wir genau an der Regel 3 # aussehen wird es offensichtlich , dass es ein System _, t_, s_Präfixe, warum schlägt vor , _in erster Linie gewählt.
- Wir verwenden
_camelCasefür interne und private Felder und verwenden diese nach Möglichkeit schreibgeschützt. Präfix Instanzfelder mit _, statische Felder mit s_und Thread statische Felder mit t_. Bei Verwendung auf statischen Feldern readonlysollte nach kommen static(dh static readonlynicht readonly static).
- Wir vermeiden, es
this.sei denn, dies ist unbedingt erforderlich.
Also , wenn Sie wie .NET CoreFX Team arbeitet an einem gewissen Leistung kritisch, multithreaded, Systemebene Code , dann ist es dringend empfohlen , dass Sie:
- halten sich an ihre Kodierungsstandards und
- Verwenden Sie die Unterstrich-Notation und
- Lies diese Antwort nicht weiter
Ansonsten lesen Sie bitte weiter ...
DIE URSPRÜNGLICHE ANTWORT:
Lassen Sie uns zunächst vereinbaren, worüber wir sprechen. Die Frage ist, wie wir aus nicht statischen Methoden und Konstruktoren einer Klasse / Unterklasse auf Instanzmitglieder zugreifen, wenn Sichtbarkeitsmodifikatoren dies zulassen.
Unterstreichungsnotation
- schlägt vor, dass Sie das Präfix "_" in den Namen privater Felder verwenden
- Es heißt auch, dass Sie "dies" niemals verwenden sollten, es sei denn, dies ist absolut notwendig
Diese Notation
- schlägt vor, dass Sie einfach immer "dies" verwenden. um auf ein Instanzmitglied zuzugreifen
Warum existiert diese Notation?
Weil du so bist
- Unterscheiden Sie einen Parameter von einem Feld, wenn sie denselben Namen haben
- Stellen Sie sicher, dass Sie im Kontext der aktuellen Instanz arbeiten
Beispiel
public class Demo
{
private String name;
public Demo(String name) {
this.name = name;
}
}
Warum existiert die Unterstrich-Notation?
Einige Leute mögen es nicht, "dies" einzugeben, aber sie brauchen immer noch eine Möglichkeit, ein Feld und einen Parameter zu unterscheiden. Deshalb haben sie sich bereit erklärt, "_" vor einem Feld zu verwenden
Beispiel
public class Demo
{
private String _name;
public Demo(String name) {
_name = name;
}
}
Man könnte denken, es ist nur eine Frage des persönlichen Geschmacks und beide Wege sind gleich gut / schlecht. Es gibt jedoch bestimmte Aspekte, bei denen diese Notation die Unterstrichnotation übertrifft:
Klarheit
- Unterstrich-Notation überladen Namen
- Diese Notation hält die Namen intakt
Kognitive Belastung
Die Unterstrich-Notation ist inkonsistent. Sie behandelt Felder auf besondere Weise, kann sie jedoch nicht jedes Mal mit anderen Mitgliedern verwenden, wenn Sie sich fragen müssen, ob Sie eine Eigenschaft oder ein Feld benötigen
Diese Notation ist konsistent, Sie müssen nicht denken, Sie verwenden einfach immer "dies", um auf ein Mitglied zu verweisen
UPDATE: Wie bereits erwähnt, ist das Folgende kein Vorteilspunkt
Instandhaltung
Bei der Unterstrichnotation müssen Sie _beim Refactoring ein Auge darauf haben , z. B. ein Feld in eine Eigenschaft verwandeln (entfernen _) oder das Gegenteil (hinzufügen _).
Diese Notation hat kein solches Problem
Autovervollständigung
Wenn Sie die Liste der Instanzmitglieder anzeigen müssen:
- Die Unterstrich-Notation hilft Ihnen nicht viel, denn wenn Sie "_" eingeben, zeigt das Popup für die automatische Vervollständigung die privaten Felder und alle Typen an, die in den verknüpften Assemblys verfügbar sind, gemischt mit den übrigen Instanzmitgliedern
- Diese Notation gibt Ihnen eine klare Antwort, indem Sie "dies" eingeben. Alles, was Sie sehen, ist die Liste der Mitglieder und sonst nichts
Mehrdeutigkeit
Manchmal muss man mit dem Code ohne Hilfe des Intellisense umgehen. Zum Beispiel, wenn Sie Codeüberprüfungen durchführen oder den Quellcode online durchsuchen.
Die Unterstrich-Notation ist nicht eindeutig: Wenn Sie Something.SomethingElse sehen, können Sie nicht sagen, ob Something eine Klasse und SomethingElse ihre statische Eigenschaft ist ... oder vielleicht ist Something eine aktuelle Instanzeigenschaft, die ihre eigene Eigenschaft von SomethingElse hat
Diese Notation ist klar: Wenn Sie Something.SomethingElse sehen, kann dies nur eine Klasse mit einer statischen Eigenschaft bedeuten, und wenn Sie diese sehen.Something.SomethingElse wissen Sie, dass Something ein Mitglied ist und SomethingElse seine Eigenschaft
Erweiterungsmethoden
Sie können keine Erweiterungsmethoden für die Instanz selbst verwenden, ohne "this" zu verwenden.
- Die Unterstrich-Notation erfordert, dass Sie "dies" nicht verwenden, jedoch mit den Erweiterungsmethoden, die Sie benötigen
- Diese Notation erspart Ihnen das Zögern. Sie verwenden immer "this", Punkt.
Visual Studio-Unterstützung
Offizielle Empfehlungen
Es gibt viele offizielle Richtlinien, die eindeutig sagen "Verwenden Sie keine Unterstriche", insbesondere in C #