Wie benennen Sie Ihre privaten Variablen in C #? [geschlossen]


25

Was ist die bewährte Methode, die am häufigsten akzeptierten Namenskonventionen für private Variablen in C #?

  1. private int myInteger;
  2. private int MyInteger;
  3. private int mMyInteger;
  4. private int _myInteger;
  5. private int _MyInteger;
  6. Mysteriöse andere Option

Welches verwenden Sie und warum? (Mein Unternehmen ist ziemlich neu in C # und ich möchte die branchenweit am meisten akzeptierte Methode auswählen, um in unseren Codierungsstandard einzusteigen.)


Warum nicht automatisch implementierte Eigenschaften verwenden? msdn.microsoft.com/en-us/library/bb384054.aspx
Kyle Ballard

1
C # hat Standards dafür, siehe stackoverflow.com/questions/14967/…
Tamara Wijsman

7
Es ist nicht schön, öffentlich über private Variablen zu sprechen. Sorry, musste nur.
Mark C

Ich verwende das gleiche wie azheglov (m_someVariable) mit der Ausnahme, dass ich _someVariable nur im lokalen Bereich für eine Methode verwende.
Lord-Fu

7
@Mark Ich denke, es sollte "private Mitglieder" sein, damit das suggestiv ist.
EpsilonVector

Antworten:


44

In den Entwurfsrichtlinien für MSDN-Klassen http://msdn.microsoft.com/en-us/library/ta31s3bc.aspx wird Option 1 - myInteger empfohlen.

Ich habe diesen Stil immer benutzt. Ich habe eine persönliche Abneigung gegen den _-Charakter.


1
Ich mochte das Zeichen _ nicht, bis der Resharper der Intelligenz eine mittlere Zeichenfolge hinzufügte. Jetzt kann ich tippen myIntegerund es wird weiter passen _myInteger. Aber ich wusste nicht, dass das Sicherheitsdatenblatt sagt, dass der _
Vaccano

4
Wie kann ich feststellen, ob myIntegereine Variable lokal für eine Methode oder ein privates Klassenmitglied ist , wenn Sie Option 1 verwenden ?
Wizard79

4
@ Lorenzo this.myInteger;)
TWith2Sugars

12
Aber aber ... "das" ist 4 Zeichen und "_" ist nur eines! Eigentlich macht diese Richtlinie viel Sinn, aber in meinem Büro liebt jeder das Unterstreichen und hasst es, "this.Foo" zu sehen, aus welchem ​​Grund auch immer. Manchmal sind die einzigen Richtlinien, die wichtig sind, diejenigen, die Ihnen am Arbeitsplatz auferlegt werden.
CodexArcanum

2
Das Argument über die Anzahl der Zeichen ist umstritten. Sie müssen nicht thisjedes Mal eingeben, sondern nur die Methoden, bei denen eine lokale Variable mit demselben Namen vorhanden ist. Sie müssen jedoch jedes Mal ein zusätzliches Symbol schreiben, wenn Sie einen Unterstrich verwenden. Ich bin damit einverstanden, dass es immer wichtig ist, sich an Ihre lokale Code-Vereinbarung zu halten.
Malcolm,

25

Ich benutze Option 4 oben:

private int _myInteger;

Ich möchte einen Hinweis auf den Gültigkeitsbereich in meinen Variablennamen haben, und der Unterstrich reicht für diesen Zweck aus. Es ist auch ziemlich einfach zu lesen.


5
Ich bin mir nicht einig, dass es einfach zu lesen ist, insbesondere wenn Sie mit mehreren Variablen arbeiten müssen.
Restuta

15

Ich benutze das folgende Namensschema:

  • 1st (myInteger) für Variablen mit lokalem Gültigkeitsbereich
  • 2nd (MyInteger) für öffentliche Eigenschaften
  • 4. (_myInteger) für private Variablen

14

Ich denke, die Option 4 ist wirklich die am besten lesbare Option. Es hilft Ihnen dabei, dies zu tun:

public Person(string name, int age) 
{
    this.name = name;
    this.age = age;
}

Es macht auch alle privaten Mitglieder auffälliger. Woher kommt der Teufel im folgenden Beispiel age? Ohne die thisQualifikation ist es schwerer zu sagen.

private void Method()
{
    var x = 2;
    var y = age + x;
}

Das ist viel einfacher zu verstehen:

private void Method()
{
    var x = 2;
    var y = _age + x;
}

1
Früher habe ich auf Ihr erstes Beispiel geschworen, aber nachdem ich eine Weile Option 4 ausprobiert habe, bevorzuge ich die Verwendung von Unterstrichen als Präfix für private Felder.
Jeremy Wiebe

2
Ich sage, verwenden Sie 1 für private Variablen, verwenden Sie 4 für private Variablen, die in Eigenschaften verwendet werden.
Evan Plaice

2
Ich muss ChaosPandoin widersprechen. Für mich sind beide Implementierungen von Method () einfach zu lesen. Sobald ich die Altersvariable (oder _age) sehe und bemerke, dass sie nicht in der Methode deklariert ist, stelle ich fest, dass sie an einer anderen Stelle in der Klasse deklariert werden muss. Dieses Qualifikationsmerkmal ist schrecklich, aber zumindest auf die Konstruktormethode beschränkt.
David Kennedy

10

PascalCasing ist in der Regel für öffentliche Eigenschaften, Konstanten, Methoden usw. der Klasse reserviert. Also würde ich 2 und 5 überspringen.

Zweitens wird von der ungarischen Notation in der .NET-Welt abgeraten, sodass (ähm, ich denke) 3 richtig ist. Angenommen, das ist was mit 3 los ist.

Das geht mit camelCasing und _camelCasing. Normalerweise verwende ich _camelCasing für Klassenvariablen und normales altes camelCasing für Variablen, die auf eine Methode oder eine engere Ebene beschränkt sind. Camel-Gehäuse ist der akzeptierte Standard für Methodenargumente, geschützte / private Variablennamen und Variablen innerhalb einer Methode oder eines engeren Bereichs.

Ich stelle auch gerne den Unterstrich voran, damit meine privaten Variablen in meinem Intellisense gruppiert sind. Ich mache dies jedoch nur für Variablen, die einem Typ zugeordnet sind. Variablen, die innerhalb einer Methode oder eines engeren Bereichs deklariert wurden, lassen den Unterstrich weg. Vereinfacht die Trennung und das Zusammenhalten weniger verwendeter Variablen.


2
Ich verstehe nicht, warum Sie _camelCasing für Klassenvariablen verwenden würden, da es normalerweise offensichtlich ist, dass es sich um Klassenvariablen handelt.
Alternative

1
@math nein, es ist nicht offensichtlich in der Intellisense. Denken Sie daran, dass Felder (Variablen mit Klassenbereich) (fast) dasselbe Symbol haben wie Variablen mit Methodenbereich. Sie sehen also genau gleich aus, wenn Sie nicht genau hinsehen. Durch den Unterstrich werden sie optisch unterschieden und in Gruppen zusammengefasst. Dies ist hilfreich, wenn Sie sie nicht häufig verwenden (was Sie nicht tun sollten, da der Status der Feind der fehlerfreien Programmierung ist).
Abgezockt

Ich habe nie etwas über den Intellisense gesagt. Ich spreche über den Unterschied zwischen Color.ClassMethod () und myColor.InstanceMethod (), nämlich dass es offensichtlich sein sollte, dass ClassMethod () eine Klassenmethode ist, da Color eine Klasse ist.
Alternative

@math Sie vor: I don't understand why you would use _camelCasing for class variables Sie nach: I'm talking about the difference between Color.ClassMethod() and myColor.InstanceMethod()Entschuldigen Sie, während ich verwirrt bin. Hören Sie, ich verwende Klassenvariablen nur selten, daher ist es schön, durch Drücken von _ an ihre Namen erinnert zu werden und sie alle in der Intellisense-Anzeige schön und gruppiert erscheinen zu lassen.
Vom

2
@mathepic: Wenn Will "Klassenvariablen" sagt, meint er (private) Instanzfelder. Sie scheinen das, was er sagte, als statische Elemente interpretiert zu haben. aber das hat er nicht gesagt.
Dan Tao,

4

private int integer

Wenn Sie in einem Methodenbereich zwischen Member- und lokalen Variablen verwechseln, müssen Sie wahrscheinlich eine Umgestaltung vornehmen.


+1: Darum geht es meiner Meinung nach. BTW: Ich sehe die Quelle, aber der Name integerkönnte vielleicht besser umformuliert werden value?
Wolf

2

Ich glaube, der beste Weg, dies zu tun (in C # / .net), ist eine Kombination aus 2 und 6:

private int MyInteger { get; set; }

Hier gibt es theoretisch überhaupt keine Variable, aber sie sieht aus und verhält sich wie eine private Instanzvariable. Wenn wir diesem Wert eine Geschäftslogik hinzufügen müssen (es ist ein vollständig interner Wert, damit wir alles tun können, was wir wollen), dann ist er bereits für uns "eigensinnig". Ein heißer, dampfender Pokal des Gewinns!


2

Ich mache Option 4, weil die SSCLI so aussieht, aber ehrlich gesagt ist mir die Benennung von privaten Variablen egal. Öffentlichkeit ist eine andere Geschichte.

Übrigens hast du m_MyInteger vergessen


2

Ich würde es nicht "mein" nennen!

Aber ich würde sagen

class C
{
     int VariableName { get; set; }
}

Das ist oftmals besser als explizite Variablen. Wenn ich eine explizite private Variable hätte, würde ich es aufrufenint _variableName;


1

In C ++ verwende ich _ häufig, wenn ich den Editor wechsle, wodurch ich nicht erkennen kann, ob es privat ist.

Bei C # neige ich dazu, _ wegzulassen, da Visual Studio es mir ermöglicht, zu prüfen, ob es privat ist.

Ich neige dazu, die Camel Case-Methode zu verwenden, um dies zu tun.


1

Ich benutze 4 ( private int _myInteger;) weil:

private int myInteger;

So benenne ich meine lokalen Variablen.

private int MyInteger;

So benenne ich Konstanten.

private int mMyInteger;

Dies ist kein C # -Stil.

private int _MyInteger;

Das sieht komisch aus.


1

mit dem Unterstrich.

Bill Wagner erklärt, warum in Effective C # . Aber ich würde nie eine ganze Zahl nennen meine Integer , besser etwas wie _age oder _length. Das Einfügen des TypeName in den Instanznamen ist eine schreckliche Praxis. Namen sollten selbsterklärend sein und da C # typensicher ist, können Typen jederzeit ermittelt werden.


1
Ja, es war jedoch ein Beispiel.
Vaccano

1

Sie müssen ein genaueres Beispiel geben, aber:

private int count, private int badFileCount,private static readonly int ReconnectAttemptsLimit

Übrigens erhalten Sie all dies KOSTENLOS, wenn Sie die neueste und beste Version installieren und verwenden MSFT Stylecop.


0

Ich gehe nach Option 5: private int _MyFoo

Ich sehe allerdings keinen wirklichen Wettbewerbsvorteil gegenüber _myFoo.


0

Verwenden Sie camelCasing für private Variablen wie myInteger

Berücksichtigen Sie ein vorangestelltes Argument, _wenn die Variable eine Sicherung für eine Eigenschaft ist, um Verwirrungen zu
vermeiden. Variable _myPropertyfür EigenschaftMyProperty


0

Ich habe ReSharper meine Variablen genannt, nicht nur meine, sondern auch alle anderen. Während des Projekts herrscht ein hohes Maß an Konsistenz.


0

Der IDesign C # -Codierungsstandard von Juval Lowy ist sehr beliebt. Diese Norm empfiehlt, privaten Mitgliedsvariablen das Präfix "m_" (Option 6) voranzustellen. Das machen wir in unserem Team.

private int m_myInteger;

Option 4 ( _myInteger) ist eine akzeptable Abwandlung dieser Norm.

Die MSDN-Empfehlung ( myInteger) hat mir nicht gefallen , da es schwierig ist, ein privates Mitglied von einer lokalen Variablen zu unterscheiden. Ihre Empfehlung löst natürlich dieses Problem, indem sie private Mitglieder mit qualifiziert this, was mir überflüssig erscheint.

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.