Es ist üblich, einen _var
Variablennamen in einem Klassenfeld zu sehen. Was bedeutet der Unterstrich? Gibt es eine Referenz für all diese speziellen Namenskonventionen?
c#
c++
naming-conventions
Stan
quelle
quelle
Antworten:
Der Unterstrich ist einfach eine Konvention; nichts mehr. Als solches ist seine Verwendung für jede Person immer etwas anders. So verstehe ich sie für die beiden fraglichen Sprachen:
In C ++ gibt ein Unterstrich normalerweise eine private Mitgliedsvariable an.
In C # wird es normalerweise nur verwendet, wenn die zugrunde liegende private Mitgliedsvariable für eine öffentliche Eigenschaft definiert wird. Andere private Mitgliedsvariablen hätten keinen Unterstrich. Diese Verwendung ist jedoch mit dem Aufkommen automatischer Eigenschaften weitgehend auf der Strecke geblieben.
Vor:
Nach dem:
quelle
public string Name { get; private set; }
. Es ist zwar nicht vollkommen unveränderlich, aber es ist da._var
ist nicht reserviert.Es wird empfohlen, UNDERSCORES NICHT vor einem Variablennamen oder Parameternamen in C ++ zu verwenden
Namen, die mit einem Unterstrich oder einem doppelten Unterstrich beginnen, werden für die C ++ - Implementierer VORBEHALTEN. Namen mit einem Unterstrich sind für die Bibliothek reserviert.
Wenn Sie den C ++ Coding Standard gelesen haben, sehen Sie, dass auf der ersten Seite Folgendes steht:
Im ISO-Arbeitsentwurf sind insbesondere die tatsächlichen Regeln aufgeführt:
Es wird empfohlen, ein Symbol nicht mit einem Unterstrich zu beginnen, falls Sie versehentlich in eine der oben genannten Einschränkungen geraten.
Sie können sich selbst davon überzeugen, warum die Verwendung von Unterstrichen bei der Entwicklung einer Software katastrophal sein kann:
Versuchen Sie, ein einfaches helloWorld.cpp-Programm wie folgt zu kompilieren:
Sie sehen alles, was im Hintergrund passiert. Hier ist ein Ausschnitt:
Sie können sehen, wie viele Namen mit einem doppelten Unterstrich beginnen!
Wenn Sie sich die Funktionen virtueller Elemente ansehen, werden Sie feststellen, dass * _vptr der Zeiger ist, der für die virtuelle Tabelle generiert wird und automatisch erstellt wird, wenn Sie eine oder mehrere Funktionen virtueller Elemente in Ihrer Klasse verwenden! Aber das ist eine andere Geschichte ...
Wenn Sie Unterstriche verwenden, können Konflikte auftreten und Sie haben keine Ahnung, was sie verursacht, bis es zu spät ist.
quelle
Eigentlich kommt die
_var
Konvention von VB, nicht von C # oder C ++ (m _, ... ist eine andere Sache).Dies überwand die Groß- und Kleinschreibung von VB bei der Deklaration von Eigenschaften.
Zum Beispiel ist ein solcher Code in VB nicht möglich , weil sie der Auffassung ist
user
undUser
als die gleiche KennungUm dies zu überwinden, verwendeten einige eine Konvention, um dem privaten Feld '_' hinzuzufügen, um so zu kommen
Da viele Konventionen für .Net gelten und eine gewisse Einheitlichkeit zwischen der C # - und der VB.NET-Konvention gewährleisten sollen, verwenden sie dieselbe.
Ich fand die Referenz für das, was ich sagte: http://10rem.net/articles/net-naming-conventions-and-programming-standards---best-practices
quelle
Der erste Kommentator (R Samuel Klatchko) verwies auf: Welche Regeln gelten für die Verwendung eines Unterstrichs in einem C ++ - Bezeichner? Dies beantwortet die Frage nach dem Unterstrich in C ++. Im Allgemeinen sollten Sie keinen führenden Unterstrich verwenden, da dieser dem Implementierer Ihres Compilers vorbehalten ist. Der Code, den Sie sehen,
_var
ist wahrscheinlich entweder Legacy-Code oder Code, der von jemandem geschrieben wurde, der mit dem alten Benennungssystem aufgewachsen ist, das die führenden Unterstriche nicht missbilligt hat.Wie in anderen Antworten angegeben, wurde es in C ++ verwendet, um Klassenmitgliedsvariablen zu identifizieren. Es hat jedoch keine besondere Bedeutung für Dekorateure oder Syntax. Wenn Sie es also verwenden möchten, wird es kompiliert.
Ich werde die C # -Diskussion anderen überlassen.
quelle
_var hat keine Bedeutung und dient nur dazu, die Unterscheidung zu erleichtern, dass die Variable eine private Mitgliedsvariable ist.
In C ++ ist die Verwendung der _var-Konvention eine schlechte Form, da es Regeln für die Verwendung des Unterstrichs vor einem Bezeichner gibt. _var ist als globale Kennung reserviert, während _Var (Unterstrich + Großbuchstabe) jederzeit reserviert ist. Aus diesem Grund werden in C ++ Benutzer angezeigt, die stattdessen die var_-Konvention verwenden.
quelle
Sie können Ihre eigenen Codierungsrichtlinien erstellen. Schreiben Sie einfach eine klare Dokumentation für den Rest des Teams.
Die Verwendung von _field hilft Intelilsense, alle Klassenvariablen zu filtern, die nur _ eingeben.
Normalerweise befolge ich die Brad Adams-Richtlinien , es wird jedoch empfohlen, keinen Unterstrich zu verwenden.
quelle
Der Microsoft-Namensstandard für C # besagt, dass Variablen und Parameter die Kleinbuchstaben- IE verwenden sollten :
paramName
. Die Norm fordert auch Felder die gleiche Form zu folgen , aber dies unklar Code führen kann , so viele Teams für einen Unterstrich Präfix Anrufklarheit zu verbessern IE:_fieldName
.quelle
In C # wird in den Microsoft Framework-Entwurfsrichtlinien empfohlen , den Unterstrich für öffentliche Mitglieder nicht zu verwenden. Für private Mitglieder können Unterstriche verwendet werden. Tatsächlich verwendet Jeffrey Richter (oft in den Richtlinien zitiert) beispielsweise ein m_ und ein "s_" für private statische Mitglieder.
Persönlich benutze ich nur _, um meine privaten Mitglieder zu markieren. "m_" und "s_" grenzen an die ungarische Notation, die nicht nur in .NET verpönt ist, sondern auch sehr ausführlich sein kann, und ich finde Klassen mit vielen Mitgliedern schwierig, einen schnellen Augenscan alphabetisch durchzuführen (stellen Sie sich 10 Variablen vor, die alle mit m_ beginnen). .
quelle
Ich verwende die _var-Benennung für Mitgliedsvariablen meiner Klassen. Ich habe zwei Hauptgründe:
1) Es hilft mir, Klassenvariablen und lokale Funktionsvariablen im Auge zu behalten, wenn ich meinen Code später lese.
2) Es hilft in Intellisense (oder einem anderen Code-Vervollständigungssystem), wenn ich nach einer Klassenvariablen suche. Nur das erste Zeichen zu kennen, ist hilfreich beim Filtern durch die Liste der verfügbaren Variablen und Methoden.
quelle
Für die Sprachen C und C ++ hat ein Unterstrich im Namen (Anfang, Mitte oder Ende) keine besondere Bedeutung. Es ist nur ein gültiges Variablennamenzeichen. Die "Konventionen" stammen aus Codierungspraktiken innerhalb einer Codierungsgemeinschaft.
Wie bereits in verschiedenen Beispielen oben angegeben, kann _ am Anfang private oder geschützte Mitglieder einer Klasse in C ++ bedeuten.
Lassen Sie mich nur eine Geschichte erzählen, die Spaß machen kann. Wenn Sie unter UNIX über eine Kernfunktion der C-Bibliothek und ein Kernel-Back-End verfügen, in dem Sie die Kernelfunktion auch dem Benutzerbereich zugänglich machen möchten, bleibt das _ vor dem Funktionsstub hängen, der die Kernelfunktion direkt aufruft, ohne etwas anderes zu tun. Das bekannteste und bekannteste Beispiel hierfür ist exit () vs _exit () unter Kerneln vom Typ BSD und SysV: Dort erledigt exit () User-Space-Aufgaben, bevor der Exit-Service des Kernels aufgerufen wird, während _exit nur dem Exit-Service des Kernels zugeordnet wird.
Also wurde _ für "lokales" Zeug verwendet, in diesem Fall ist local maschinenlokal. Normalerweise waren _functions () nicht portierbar. Insofern sollten Sie nicht dasselbe Verhalten auf verschiedenen Plattformen erwarten.
Nun zu _ in Variablennamen, wie z
int _foo;
Nun, psychologisch gesehen ist ein _ eine seltsame Sache, die man am Anfang eingeben muss. Wenn Sie also einen Variablennamen erstellen möchten, bei dem die Wahrscheinlichkeit eines Konflikts mit etwas anderem geringer ist, sollten Sie INSBESONDERE bei der Verwendung von Vorprozessorsubstitutionen die Verwendung von _ in Betracht ziehen.
Mein grundlegender Rat wäre, immer die Konvention Ihrer Coding-Community zu befolgen, damit Sie effektiver zusammenarbeiten können.
quelle
Es bedeutet einfach, dass es sich um ein Mitgliedsfeld in der Klasse handelt.
quelle
Es gibt keine bestimmte Namenskonvention, aber ich habe das für private Mitglieder gesehen.
quelle
Viele Leute möchten, dass privaten Feldern ein Unterstrich vorangestellt wird. Es ist nur eine Namenskonvention.
Die offiziellen Namenskonventionen von C # schreiben einfache Kleinbuchstaben (kein Unterstrich) für private Felder vor.
Standardkonventionen für C ++ sind mir nicht bekannt, obwohl Unterstriche sehr häufig verwendet werden.
quelle
Es ist nur eine Konvention, die einige Programmierer verwenden, um deutlich zu machen, wenn Sie ein Mitglied der Klasse oder eine andere Art von Variable (Parameter, lokal für die Funktion usw.) manipulieren. Eine andere Konvention, die auch für Mitgliedsvariablen weit verbreitet ist, ist das Präfixieren des Namens mit 'm_'.
Auf jeden Fall sind dies nur Konventionen, und Sie werden nicht für alle eine einzige Quelle finden. Sie sind eine Frage des Stils und jedes Programmierteam, Projekt oder Unternehmen hat seine eigenen (oder sogar keine).
quelle
Es gibt einen völlig legitimen Grund, es in C # zu verwenden: Wenn der Code auch über VB.NET erweiterbar sein muss. (Sonst würde ich nicht.)
Da bei VB.NET die Groß- und Kleinschreibung nicht berücksichtigt wird, gibt es
field
in diesem Code keine einfache Möglichkeit, auf das geschützte Mitglied zuzugreifen :Dies greift beispielsweise auf den Property Getter zu, nicht auf das Feld:
Heck, ich kann nicht einmal
field
in Kleinbuchstaben schreiben - VS 2010 korrigiert es einfach weiter.Um es abgeleiteten Klassen in VB.NET leicht zugänglich zu machen, muss eine andere Namenskonvention entwickelt werden. Das Präfixieren eines Unterstrichs ist wahrscheinlich der am wenigsten aufdringliche und "historisch akzeptierte" von ihnen.
quelle
Jetzt ist die Notation mit "this" wie in this.foobarbaz für Mitgliedsvariablen der C # -Klasse akzeptabel. Es ersetzt die alte Notation "m_" oder nur "__". Es macht den Code besser lesbar, da es keinen Zweifel gibt, worauf Bezug genommen wird.
quelle
Aus meiner Erfahrung (sicherlich begrenzt) zeigt ein Unterstrich an, dass es sich um eine private Mitgliedsvariable handelt. Wie Gollum sagte, wird dies jedoch vom Team abhängen.
quelle
Alte Frage, neue Antwort (C #).
Eine andere Verwendung von Unterstrichen für C # ist die DI (Dependency Injection) von ASP NET Core. Private
readonly
Variablen einer Klasse, die während der Erstellung der injizierten Schnittstelle zugewiesen wurden, sollten mit einem Unterstrich beginnen. Ich denke, es ist eine Debatte, ob für jedes private Mitglied einer Klasse ein Unterstrich verwendet werden soll (obwohl Microsoft selbst dem folgt), aber dieser ist sicher.quelle
Eine solche Namenskonvention ist nützlich, wenn Sie Code lesen, insbesondere Code, der nicht Ihr eigener ist. Eine starke Namenskonvention gibt an, wo ein bestimmtes Mitglied definiert ist, um welche Art von Mitglied es sich handelt usw. Die meisten Entwicklungsteams verwenden eine einfache Namenskonvention und stellen den Mitgliedsfeldern einfach einen Unterstrich (
_fieldName
) voran . In der Vergangenheit habe ich die folgende Namenskonvention für C # verwendet (die auf Microsoft-Konventionen für den .NET Framework-Code basiert, die mit Reflector angezeigt werden):Instanzfeld : m_fieldName
Statisches Feld: s_fieldName
Öffentliches / geschütztes / internes Mitglied: PascalCasedName ()
Privates Mitglied: camelCasedName ()
Dies hilft den Menschen, die Struktur, Verwendung, Zugänglichkeit und Position von Mitgliedern zu verstehen, wenn sie unbekannten Code sehr schnell lesen.
quelle