Unterstreichen oder nicht unterstreichen, das ist die Frage


130

Gibt es Probleme, privaten Feldern keinen Unterstrich in C # voranzustellen, wenn die Binärversion von anderen Framework-Sprachen verwendet werden soll? Da bei C # beispielsweise zwischen Groß- und Kleinschreibung unterschieden wird, können Sie ein Feld "foo" und die öffentliche Eigenschaft "Foo" aufrufen, und es funktioniert einwandfrei.

Hätte dies irgendeine Auswirkung auf Groß- und Kleinschreibung Sprache wie VB.NET, wird es durch eine CLS-Compliance (oder andere) Probleme , wenn die Namen nur unterscheidbar sind durch Gehäuse?


18
Der Punkt des Unterstrichpräfixes BTW besteht nicht darin, Fallprobleme zu behandeln. Es soll in der Lage sein, Felder und Einheimische beim Lesen von Code einfach und visuell voneinander zu unterscheiden. Ich werde es in C # und VB gleichermaßen verwenden.
Neil Hewitt

2
@NeilHewitt: Nun, es verhindert auch, dass Funktionsparameter mit Mitgliedsvariablen in Konflikt stehen, bei denen jeder von ihnen vorangestellt werden muss, was scheiße ist this. EDIT: Ich habe gerade auf einen vier Jahre alten Kommentar geantwortet ...
Ed S.

Nur aus Gründen der Klarheit ist der offizielle Standard _camelCase(schreibgeschützt) github.com/dotnet/corefx/blob/master/Documentation/…
Chris Marisic

Ich bevorzuge _camelCase für private Backing Stores. dh: die private Datei, die die zugewiesenen Daten enthält, auf die über eine Eigenschaft zugegriffen wird. Ich mag Auto-Eigenschaften nicht, weil sie nicht mit einem bekannten Wert in der Klassendefinition initialisiert werden können. Wenn ich einen Nebeneffekt im Setter haben möchte, benötige ich einen explizit deklarierten Hintergrundspeicher. Leider wird dies überarbeitet, wenn ich ^ R ^ E im c # -Editor verwende, sodass ich es jedes Mal wieder hinzufügen muss.
TomXP411

Antworten:


46

Es wird keine Wirkung haben.

Ein Teil der Empfehlungen zum Schreiben von CLS-kompatiblen Bibliotheken besteht darin, NICHT zwei öffentliche / geschützte Entitäten zu haben, die sich nur von Fall zu Fall unterscheiden, z. B. sollten Sie NICHT haben

public void foo() {...}

und

public void Foo() {...}

Was Sie beschreiben, ist kein Problem, da das private Element dem Benutzer der Bibliothek nicht zur Verfügung steht


1
Auch wenn es keine Auswirkungen geben wird, ist es dennoch eine Konvention, mit der ich mich unwohl fühle - da es ein Rezept für Verwirrung ist, wenn sie sich nur von Fall zu Fall unterscheiden. Es ist einfach zu leicht, falsch zu lesen oder falsch zu tippen, wenn der einzige Unterschied das Anfangskapital ist.
ChrisA

2
PS Persönlich unterstreiche ich nicht in C #. Für mich ist es eine persönliche Präferenz, keine religiöse Überzeugung
Binary Worrier

1
Ich habe beides getan und wollte mich ein für alle entscheiden, basierend auf Wissen: P
TheCodeJunkie

46
Ich benutze Unterstriche. Es ist einfacher, sie von den Argumenten und lokalen Variablen zu unterscheiden.
Rinat Abdullin

4
Ich verwende _ nur für private Felder, habe jedoch aufgrund der automatischen Eigenschaft 3.5 fast nie private Felder. Im Allgemeinen habe ich nur dann ein privates Feld, wenn ich ein verzögertes Laden für nicht primitive Typen implementiere.
Chris Marisic

277

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.

  1. 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).
  2. 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

  • Die Unterstrich-Notation bietet in Visual Studio keine integrierte Unterstützung
  • Diese Notation wird von Visual Studio natürlich unterstützt:

    1. "Dies." Qualifikation : Bevorzugen Sie, dass alle nicht statischen Felder, die in nicht statischen Methoden verwendet werden, this.in C # vorangestellt werden

Offizielle Empfehlungen

Es gibt viele offizielle Richtlinien, die eindeutig sagen "Verwenden Sie keine Unterstriche", insbesondere in C #


22
Dies ist eine erstaunliche Antwort. Vielen Dank, dass Sie sich die Zeit genommen haben, all diese Informationen zusammenzustellen.
Tigran

5
Kommt nicht aus C ++, da in C ++ Bezeichner reserviert sind, die mit einem Unterstrich für die Verwendung von Sprache und Standardbibliotheken beginnen.
Rob G

7
Warum unterscheiden Sie zwischen leistungskritischem Multithread-Code auf Systemebene und anderem Code? Wie _camelCasehilft mir die Verwendung, wenn mein Code leistungskritisch ist / Code auf Systemebene?
BornToCode

6
Die Verwendung von Unterstrichen hat nichts mit dem Schreiben von leistungskritischem Code mit mehreren Threads oder auf Systemebene zu tun. Auf die Konsistenz kommt es an, und das CoreFX-Team ist nur ein Team, das sich auf eine bestimmte Konvention geeinigt hat. Dies ist eine großartige Antwort, die von einer sehr schönen Analyse untermauert wird, in der Namenskonventionen verglichen werden. Ich glaube jedoch, dass der zusätzliche Teil "Unterstriche sind besser, weil das CoreFX-Team dies sagt" die Qualität wirklich verringert.
Şafak Gür

5
Mein Problem ist, dass ich logische Folgerungen verstehe. en.wikipedia.org/wiki/Inference Aber hey, ich verstehe, es ist nicht jedermanns Sache.
user603563

67

Entnommen aus der Microsoft StyleCop-Hilfedatei:

TypeName: FieldNamesMustNotBeginWithUnderscore

CheckId: SA1309

Ursache: Ein Feldname in C # beginnt mit einem Unterstrich.

Regelbeschreibung:

Ein Verstoß gegen diese Regel tritt auf, wenn ein Feldname mit einem Unterstrich beginnt.

Standardmäßig verbietet StyleCop die Verwendung von Unterstrichen, m_ usw., um lokale Klassenfelder zugunsten des 'this' zu markieren. Präfix. Der Vorteil von 'this'. ist, dass es für alle Elementtypen einschließlich Methoden, Eigenschaften usw. und nicht nur für Felder gleichermaßen gilt, sodass alle Aufrufe von Klassenmitgliedern sofort erkennbar sind, unabhängig davon, welcher Editor zum Anzeigen des Codes verwendet wird. Ein weiterer Vorteil besteht darin, dass eine schnelle, erkennbare Unterscheidung zwischen Instanzmitgliedern und statischen Mitgliedern erstellt wird, denen kein Präfix vorangestellt wird.

Wenn der Feld- oder Variablenname mit dem Namen eines mit Win32 oder COM verknüpften Elements übereinstimmen soll und daher mit einem Unterstrich beginnen muss, platzieren Sie das Feld oder die Variable in einer speziellen NativeMethods-Klasse. Eine NativeMethods-Klasse ist eine Klasse, die einen Namen enthält, der auf NativeMethods endet, und als Platzhalter für Win32- oder COM-Wrapper gedacht ist. StyleCop ignoriert diese Verletzung, wenn das Element in einer NativeMethods-Klasse platziert wird.

Eine andere Regelbeschreibung gibt an, dass die bevorzugte Vorgehensweise zusätzlich zu den oben genannten darin besteht, private Felder mit Kleinbuchstaben und öffentliche mit Großbuchstaben zu beginnen.

Bearbeiten: Im Anschluss daran befindet sich die Projektseite von StyleCop hier: https://github.com/DotNetAnalyzers/StyleCopAnalyzers . Das Lesen der Hilfedatei gibt einen guten Einblick, warum verschiedene Stilregeln vorgeschlagen werden.


7
Es handelt sich meistens um "Best Practices". Wie in der Regel angegeben, kann das Präfix "this" auf jedes nicht statische Element angewendet werden, während das Präfixieren mit etwas anderem aufgrund von Sprachsyntaxregeln möglicherweise nicht anwendbar ist. Das Schlüsselwort "this" macht das beabsichtigte Ziel trivial klar.
Scott Dorman

5
Ich bevorzuge auch die beabsichtigte Lösung des Problems durch die Sprache ("dies") gegenüber künstlichen Wegen, um es zu umgehen.
Galaktor

10
Es gibt auch eine Regel in derselben Software, die besagt, dass Sie keine zwei Felder haben sollten, die sich nur für den Fall unterscheiden. Was machen Sie also mit einer geschützten Variablen, die von einer öffentlichen Eigenschaft umschlossen wird?
Lilith River

5
Mein einziges Problem mit dem "kein Unterstrich" ist, dass mir beim Programmieren gegen ein (Web-) Formular oder ähnliches die Verwendung von "dies" überhaupt nicht hilft, auf die von mir definierten privaten Felder herunterzufiltern, sondern mir nur gibt eine gigantische Liste der acht Millionen anderen Immobilien, die in diesem Objekt enthalten sind.

14
StyleCop scheint zu sagen, dass ich, wenn ich mich konsequent thisauf ein Klassenmitglied beziehe, alle Aufrufe an alle Klassenmitglieder finden könnte, indem ich einfach nach suche this. Ich kann damit nicht streiten, aber ich kann mir auch keine Zeit vorstellen, in der ich das tun musste. Das Letzte, was ich tun möchte, ist, dem Codieren Langeweile hinzuzufügen und meinen Code mit this(der fast ungarisch ist) zu verunreinigen, um fast keinen praktischen Gewinn zu erzielen. Tatsache ist, wenn ich mir eine Codezeile anschaue, ist alles, was mit einem Großbuchstaben oder einem Unterstrich beginnt, ein Klassenmitglied, alles, was in Kleinbuchstaben geschrieben wird, ist ein Lokal.
Devuxer

27

Da es sich um ein privates Feld handelt, hat dies keine Auswirkungen auf einen Benutzer Ihrer Klasse.

Ich empfehle jedoch, einen Unterstrich für das private Feld zu verwenden, da dies das Verständnis des Codes erleichtern kann, z.

private int foo;
public void SetFoo(int foo)
{
  // you have to prefix the private field with "this."
  this.foo = foo;

  // imagine there's lots of code here,
  // so you can't see the method signature



  // when reading the following code, you can't be sure what foo is
  // is it a private field, or a method-argument (or a local variable)??
  if (foo == x)
  {
    ..
  }
}

In unserem Team verwenden wir immer ein Unterstrichpräfix für private Felder. Wenn ich also Code lese, kann ich sehr leicht private Felder identifizieren und sie von Einheimischen und Argumenten unterscheiden. In gewisser Weise kann der Unterstrich als Kurzfassung von "dies" angesehen werden.


14
Nun, ich stelle immer 'this' voran, egal ob ich auf ein Feld, eine Eigenschaft oder eine Methode zugreife.
TheCodeJunkie

9
Für mich ist der Unterstrich eine Art Kurzschreibweise von "dies".
M4N

2
In R # wird empfohlen, den Parameter foo nicht aufzurufen. Warum nennst du es nicht "Wert", da du weißt, dass es zum Einstellen von Foo verwendet wird?
thinkbeforecoding

17
@Martin: Das Problem mit dem Unterstrich als Abkürzung für "dies" ist, dass es nicht unbedingt auf alle Klassenmitglieder angewendet werden kann, solange "dies" möglich ist. Ich denke, der Code liest sich mit dem Schlüsselwort "this" viel einfacher / sauberer. In Ihrem Beispiel bezieht sich das if (foo == x) immer auf den Parameter foo.
Scott Dorman

3
@TheCodeJunkie: Das sind viele redundante Zeichen in Ihrer Codebasis.
Ed S.

15

Nachdem ich in einer Umgebung gearbeitet hatte, die seitdem sehr spezifische und sehr sinnlose Stilregeln hatte, kreierte ich meinen eigenen Stil. Dies ist ein Typ, den ich viel hin und her gedreht habe. Ich habe schließlich entschieden, dass private Felder immer _field sein werden, lokale Variablen niemals _ und Kleinbuchstaben sein werden, Variablennamen für Steuerelemente lose der ungarischen Notation folgen und Parameter im Allgemeinen camelCase sein werden.

Ich hasse das this.Schlüsselwort, es fügt meiner Meinung nach einfach zu viel Code-Rauschen hinzu. Ich liebe Resharper's überflüssige Entfernung. Stichwort.

6-Jahres-Update: Ich habe die Interna von Dictionary<TKey,T>auf eine bestimmte Verwendung des gleichzeitigen Zugriffs analysiert und ein privates Feld als lokale Variable falsch interpretiert. Private Felder sollten definitiv nicht die gleiche Namenskonvention wie lokale Variablen haben. Wenn es einen Unterstrich gegeben hätte, wäre das unglaublich offensichtlich gewesen.


18
Das thisSchlüsselwort ist eine garantierte Referenz auf das aktuelle Objekt. Das bekommt man nicht mit einem Unterstrich. Keine Notwendigkeit zu verabscheuen this.
Jason S

15
Warum einen "Standard" erfinden? 'Dies.' sagt Ihnen, dass das Objekt eine Instanzvariable 'Klasse' ist. sagt dir, dass es eine Klassenvariable ist. Alles andere ist eine Stapelvariable. Der Unterstrich gehört zu demselben Haufen schlechter Ideen, in dem sich die ungarische Notation jetzt zersetzt.
Quarkly

4
@ DRAirey1 zu leicht, um dies zu verpassen. wenn du es brauchst und am Ende seltsame Dinge mit dem Staat machst.
Chris Marisic

3
@ChrisMarisic Sie sind natürlich willkommen zu Ihrer Meinung über die Verwendung von _, aber setzen Sie es nicht als etablierten Standard, wenn dies eindeutig nicht der Fall ist.
Crush

3
Ich habe dich verloren bei "Ich habe meinen eigenen Stil kreiert".
rory.ap

12

Ich mag den Unterstrich, weil ich dann den Kleinbuchstaben als Methodenparameter wie diesen verwenden kann:

public class Person
{
    string _firstName;

    public MyClass(string firstName)
    {
        _firstName = firstName;
    }

    public string FirstName
    {
        get { return _firstName; }
    }
}

39
öffentliche Zeichenfolge Vorname {get; privates Set; }
Jason

3
Sie können weiterhin den Kleinbuchstaben als Methodenparameter verwenden, indem Sie das thisSchlüsselwort verwenden. Machen Sie das zu einem stummen Punkt in der laufenden und immer kontroversen "zu unterstreichen oder nicht":public MyClass(string firstName){ this.firstName = firstName; }
mateuscb

5
Es ist die Zukunft, jetzt gerade public string FirstName { get; }und der Setter ist noch im Konstruktor verfügbar
Chris Marisic

In diesem Beispiel. thiswäre nur im Konstruktor notwendig. Sie müssen es nirgendwo anders verwenden. So firstNamewie der Feldname sehr gut funktioniert.
Thomas Eyde

9

Ich mag es immer noch sehr, Unterstriche vor privaten Feldern zu verwenden, aus dem Grund, den Martin erwähnt hat, und auch, weil private Felder dann in IntelliSense zusammen sortiert werden. Dies trotz der Bösartigkeit der ungarischen Präfixnotationen im Allgemeinen.

In letzter Zeit stelle ich jedoch fest, dass die Verwendung des Unterstrichpräfixes für private Mitglieder verpönt ist, obwohl ich nicht ganz sicher bin, warum. Vielleicht weiß es jemand anderes? Ist es nur das Präfixprinzip? Oder gab es etwas mit der Namensverfälschung von generischen Typen zu tun, die in kompilierten Assemblys oder so etwas unterstrichen werden?


4
Für mich ist das Durcheinander der Wörter beim schnellen Durchsuchen von Code weniger so, als würde man nur lesen und mehr, als bei jedem anzuhalten, um es zu bestätigen und zu erkennen, dass es kein Steuerzeichen irgendeiner Art ist. Außerdem wird das Einrücken gestört, indem das erste nützliche Zeichen in den Feldnamen praktisch eine Spalte nach rechts verschoben wird. Ich mag C ++ im Allgemeinen nicht, weil die meisten C ++ - Programmierer dazu neigen, unglaublich knappen und langsam zu lesenden symbol- / maschinenähnlichen Code zu schreiben, und ich bevorzuge es einfach, diesen nicht in C # -Code zu haben :)
Oskar Duveborn

22
Für mich das das. Wenn dies schnell durch den Code gescannt wird, wird es weniger so, als würde man dies nur lesen. Und dies. Mehr so. Als müsste man aufhören und dies. um es und dies anzuerkennen. Erkenne, dass es dies ist. Kein Steuercharakter von einigen dieser Sorten. Ich würde es sehr vorziehen, gelegentlich etwas zu finden _fieldFoooder _fieldBarmeine Verwendung mit this.fieldFoooder überladen zu haben this.fieldBar. Ich finde das this.Präfix viel irritierender als ein führender Unterstrich.
AggieEric

Ich dachte, dass diese Diskrepanz in der Erfahrung möglicherweise auf Oldschool-Dateisysteme oder Dateiübertragungsprotokolle zurückzuführen ist, bei denen Leerzeichen nicht zulässig waren, wodurch einige Benutzer darin geschult wurden, Unterstriche als Leerzeichen zu betrachten und daher das Lesen nicht abzulenken. Ich hingegen habe Probleme mit solchen Dateinamen, da ich von Anfang an immer Leerzeichen in meinen eigenen Dateinamen verwendet habe ...
Oskar Duveborn

1
@AggieEric hat dort den Nagel auf den Kopf getroffen. Allein das Lesen seines Satzes bereitet mir Kopfschmerzen! Ich habe jahrelang versucht, mich an die MS-Empfehlung zu halten, und ich wurde so krank, thisüberall kleine blaue Wörter zu lesen , dass ich genau dort eine Nerd-Wut-Entscheidung traf. Jetzt verwende ich thisNUR religiös für Eigentumsreferenzen oder wenn ich explizit zwischen thisund unterscheiden muss base. Jeder für sich, denke ich :-)
Riegardt Steyn

1
Ich denke, das liegt daran, dass das Starten von Elementen mit einem Interpunktionszeichen letztendlich die Lesbarkeit beeinträchtigt. Es scheint nicht jeden zu stören, aber für mich ist es sehr unnatürlich, etwas zu lesen, das mit Interpunktion beginnt. Je mehr Englisch der Code ist, desto leichter finde ich ihn zu lesen. Und mit modernen IDEs ist es ganz einfach, den Unterschied zwischen Einheimischen und privaten Mitgliedern zu erkennen, da sie höchstwahrscheinlich unterschiedliche Farben haben werden.
Tim Long

5

Style Cop-Empfehlung oder nicht, das Eingraben in .NET Framework zeigt eine Menge "_" -Verwendung für Mitgliedsvariablen. Was auch immer die Entwickler von Style Cop empfehlen, es ist nicht das, was die Mehrheit der MS-Mitarbeiter verwendet. :) Also bleibe ich beim Unterstrich. Da ich persönlich mit dem Unterstrich viel weniger Fehler mache als mit dem (Beispiel: Wenn ich varName = varName anstelle von this.varName = varName verwende, steckt es wirklich in mir)


3
Unterstrich wird auch für den .NET Core Style Guide empfohlen: github.com/dotnet/corefx/wiki/Coding-style
landoncz

4

Ich denke, dass Felder auf Klassenebene im Großen und Ganzen ein Fehler bei der Gestaltung der Sprache sind. Ich hätte es vorgezogen, wenn die Eigenschaften von C # einen eigenen lokalen Bereich hätten:

public int Foo
{
   private int foo;
   get
   {
      return foo;
   }
   set
   {
      foo = value;
   }
}

Das würde es möglich machen, die Verwendung von Feldern vollständig einzustellen.

Das einzige Mal, dass ich einem privaten Feld einen Unterstrich voranstelle, ist, wenn für eine Eigenschaft ein separates Hintergrundfeld erforderlich ist. Dies ist auch das einzige Mal, dass ich private Felder benutze . (Und da ich niemals geschützte, interne oder öffentliche Felder verwende, ist dies das einzige Mal, dass ich Feldperioden verwende.) Wenn eine Variable einen Klassenbereich haben muss, ist sie für mich eine Eigenschaft der Klasse.


Die C # -Bande scheint Ihnen mit dem neuen privaten int foo {get; set;} Syntax Zucker.
Dana

Oh sicher; Was ich hier beschreibe, ist ohne das völlig unmöglich.
Robert Rossney

Was Sie beschreiben, ist "Automatisch implementierte Eigenschaften". Leider wird bei Visual Basic.NET tatsächlich eine "versteckte" _prefix-Variable hinter den Kulissen verwendet. Wenn Sie also eine automatisch implementierte Eigenschaft "Public Property Foo As Integer" hatten, konnte die Deklaration der Mitgliedsvariablen "Private _foo as" NICHT vorhanden sein Ganzzahl "

Nein, ich beschreibe keine automatisch implementierten Eigenschaften, zumindest nicht in meinem Beispiel. Ich beschreibe eine Scoping-Ebene, die in C # oder VB nicht vorhanden ist. Es ist wirklich bedauerlich, dass VB einen so trivialen Weg gewählt hat, um die Namen der Hintergrundfelder zu mischen. C # ist hässlich genug, dass Sie niemals versehentlich eine Variable mit demselben Namen erstellen würden.
Robert Rossney

3

Die _fieldName-Notation für private Felder ist so einfach zu brechen . Verwenden von "this". Notation ist unmöglich zu brechen. Wie würden Sie die Notation brechen? Beobachten:

private void MyMethod()
{
  int _myInt = 1; 
  return; 
}

Ich habe gerade gegen Ihre Namenskonvention verstoßen, aber sie wird kompiliert. Ich würde es vorziehen, eine Namenskonvention zu haben, die a) nicht ungarisch und b) explizit ist. Ich bin dafür, die ungarische Namensgebung abzuschaffen, und dies qualifiziert in gewisser Weise. Anstelle des Objekttyps vor dem Variablennamen haben Sie dessen Zugriffsebene.

Vergleichen Sie dies mit Ruby, wo der Name der Variablen @my_numberden Namen in den Bereich einbindet und unzerbrechlich ist.

edit: Diese Antwort ist negativ geworden. Es ist mir egal, es bleibt.


11
Es ist kaum eine gültige Kritik an einer Namenskonvention zu sagen, dass es Entwicklern möglich ist, diese nicht zu befolgen.
Robert Rossney

8
Wow, deine Definition von "leicht zu brechen" und meine sind wie völlige Gegensätze. Ihr bedeutet „leicht absichtlich zu brechen“ , während die meisten anderen Menschen wahrscheinlich mean „leicht zu brechen aus Versehen .“ Ich überlasse es dem Leser als Übung herauszufinden, welcher für das Schreiben von
Konrad Rudolph

6
@Konrad: Sie klingen anmaßend, wenn Sie "als Übung für den Leser" sagen. Dies ist kein Mathe-Lehrbuch.
JCollum

3
Etwas weniger negativ jetzt :) Während wir vielleicht gegen den Strom rudern, mag ich auch die Unterstrich-Konvention nicht. Meiner Ansicht nach unterscheidet es sich nicht von der ungarischen Notation und um ehrlich zu sein, blutet meine Augen (schadet der Lesbarkeit). Wir haben die ungarische Notation mit C # rausgeschmissen und es ist Zeit, diesen letzten Rest des Nichtvertrauens Ihrer IDE zu beseitigen.
Tim Long

1
Ich habe gehört, dass MS tatsächlich sagt, dass der Unterstrich nicht in seinem C # -Stilführer verwendet werden soll. blogs.msdn.microsoft.com/brada/2005/01/26/… - Abschnitt 2.6 - sieht so aus, als würde Brad Abrams uns zumindest zustimmen!
JCollum

1

Wenn Ihre Assembly CLS-kompatibel sein soll, können Sie das CLSCompliant-Attribut in Ihrer Assemblyinfo-Datei verwenden. Der Compiler wird sich dann beschweren, wenn Ihr Code Dinge enthält, die nicht cls-konform sind.

Wenn Sie dann zwei Eigenschaften haben, die sich nur in diesem Fall unterscheiden, gibt der Compiler einen Fehler aus. Wenn Sie jedoch ein privates Feld und ein öffentliches Eigentum in derselben Klasse haben, gibt es keine Probleme.

(Aber ich stelle meinen privaten Mitgliedern auch immer einen Unterstrich voran. Es hilft mir auch, beim Lesen meines Codes klar zu machen, dass eine bestimmte Variable ein Mitgliedsfeld ist.)


0

Ich verwende aus zwei Gründen gerne Unterstriche vor meinen privaten Feldern. Eines wurde bereits erwähnt, die Felder heben sich im Code und in Intellisense von den zugehörigen Eigenschaften ab. Der zweite Grund ist, dass ich dieselben Namenskonventionen verwenden kann, unabhängig davon, ob ich in VB oder C # codiere.


1
whoah, ist das weise? Bedeutet Unterstrich nicht, dass in VB in der nächsten Zeile fortgefahren wird?
JBRWilkinson

1
Nur wenn dem Unterstrich ein Leerzeichen folgt.
Rob Windsor

Anfangsbuchstaben in
Klein-

0

Es gibt keinerlei Auswirkungen. Wenn Ihr Code kompiliert wird, ist für den Compiler nur der Namespace und die Sichtbarkeit des Felds / der Eigenschaft wichtig. Ein Unterstrich ist bei der Benennung eines Bezeichners genauso wichtig wie jedes andere Zeichen. Der eigentliche Trick besteht darin, eine Konvention zu verwenden, die Sie und die Menschen um Sie herum verstehen werden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.