811 Stimmen

Reihenfolge der Elemente in den Klassen: Felder, Eigenschaften, Konstrukteure, Methoden

Gibt es eine offizielle C#-Richtlinie für die Reihenfolge der Elemente in Bezug auf die Klassenstruktur?

Funktioniert es:

  • Öffentliche Felder
  • Private Felder
  • Eigenschaften
  • Konstrukteure
  • Methoden
    ?

Ich bin neugierig, ob es eine feste Regel für die Reihenfolge der Artikel gibt? Ich bin ein bisschen durcheinander. Ich möchte mich an einen bestimmten Standard halten, damit ich es überall machen kann.

Das eigentliche Problem ist, dass meine komplexeren Eigenschaften am Ende sehr wie Methoden aussehen und sich am Anfang vor dem Konstruktor fehl am Platz fühlen.

Irgendwelche Tipps/Vorschläge?

1263voto

Jonathan Wright Punkte 13952

Nach Angaben der StyleCop Regeln Dokumentation die Reihenfolge ist wie folgt.

Innerhalb einer Klasse, Struktur oder Schnittstelle: (SA1201 und SA1203)

  • Konstante Felder
  • Felder
  • Konstrukteure
  • Finalisten (Zerstörer)
  • Delegierte
  • Veranstaltungen
  • Enums
  • Schnittstellen ( Interface-Implementierungen )
  • Eigenschaften
  • Indexer
  • Methoden
  • Strukturen
  • Klassen

Innerhalb jeder dieser Gruppen nach Zugriff sortieren: (SA1202)

  • öffentlich
  • intern
  • geschützt intern
  • geschützt
  • privat

Innerhalb jeder Zugangsgruppe nach statischen, dann nach nicht-statischen Zugängen: (SA1204)

  • statisch
  • nicht statisch

Innerhalb jeder der statischen/nicht statischen Gruppen von Feldern, geordnet nach schreibgeschützt, dann nicht schreibgeschützt: (SA1214 und SA1215)

  • readonly
  • nicht schreibgeschützt

Eine entrollte Liste ist 130 Zeilen lang, daher werde ich sie hier nicht entrollen. Der Teil der Methoden, der abgerollt wird, ist:

  • öffentliche statische Methoden
  • öffentliche Methoden
  • interne statische Methoden
  • interne Methoden
  • geschützte interne statische Methoden
  • geschützte interne Methoden
  • geschützte statische Methoden
  • geschützte Methoden
  • private statische Methoden
  • private Methoden

In der Dokumentation wird darauf hingewiesen, dass, wenn die vorgeschriebene Reihenfolge nicht geeignet ist - z. B. wenn mehrere Schnittstellen implementiert werden und die Schnittstellenmethoden und -eigenschaften zusammen gruppiert werden sollen -, eine partielle Klasse verwendet werden sollte, um die entsprechenden Methoden und Eigenschaften zusammenzufassen.

49voto

Ryan Lundy Punkte 195074

Wie wäre es, wenn Sie nicht nach Sichtbarkeit oder nach Art des Elements (Feld, Eigenschaft, Methode usw.), sondern nach Funktionalität gruppieren?

33voto

bright Punkte 4418

Dies ist eine alte, aber immer noch sehr relevante Frage, also füge ich sie hinzu: Wonach suchen Sie als Erstes, wenn Sie eine Klassendatei öffnen, die Sie zuvor gelesen haben oder auch nicht? Felder? Eigenschaften? Ich habe die Erfahrung gemacht, dass ich fast immer nach den Konstruktoren suche, weil es am wichtigsten ist zu verstehen, wie dieses Objekt aufgebaut ist.

Deshalb habe ich begonnen, Konstruktoren in Klassendateien an den Anfang zu stellen, und das Ergebnis war psychologisch sehr positiv. Die Standardempfehlung, Konstruktoren nach einem Haufen anderer Dinge zu platzieren, fühlt sich dissonant an.

Das kommende Feature des primären Konstruktors in C# 6 zeigt, dass der natürliche Platz für einen Konstruktor ganz oben in einer Klasse ist - tatsächlich werden primäre Konstruktoren sogar vor der öffnenden Klammer angegeben.

Es ist schon komisch, wie sehr eine solche Umstellung einen Unterschied macht. Das erinnert mich daran, wie using Anweisungen waren früher geordnet - mit den System-Namensräumen zuerst. Der Befehl "Organize Usings" von Visual Studio verwendete diese Reihenfolge. Jetzt using s werden einfach alphabetisch geordnet, ohne dass System-Namensräume eine besondere Behandlung erfahren. Das Ergebnis wirkt einfach einfacher und sauberer.

28voto

Wayne Punkte 36217

Ich weiß nicht, ob es eine Sprache oder einen Industriestandard gibt, aber ich neige dazu, die Dinge in dieser Reihenfolge anzuordnen, wobei jeder Abschnitt von einer #region umschlossen wird:

mit Anweisungen

Namespace

Klasse

Private Mitglieder

Öffentliche Liegenschaften

Konstrukteure

Öffentliche Methoden

Private Methoden

15voto

Elijah Manor Punkte 17713

Ich würde empfehlen, die Kodierungsstandards von IDesign oder die unter Website von Brad Abram . Das sind die beiden besten, die ich gefunden habe.

Brad würde sagen...

Die Klassenmitglieder sollten alphabetisch geordnet und in Abschnitte gruppiert werden (Felder, Konstruktoren, Eigenschaften, Ereignisse, Methoden, private Schnittstellenimplementierungen, verschachtelte Typen)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X