2009-03-02 5 views
35

Gibt es eine Standardmethode zum Erstellen einer C# -Datei? Wie in, Felder, dann Eigenschaften, dann Konstruktoren, etc?Wie lässt sich eine C# -Klasse am besten gestalten?

Hier ist, was ich normalerweise tue, aber ich frage mich, ob es einen Standard Weg gibt?

  1. Verschachtelte Klassen oder Aufzählungen
  2. Felder
  3. Eigenschaften
  4. Event
  5. Konstrukteurs
  6. öffentliche Methoden
  7. Private Methoden

Hat die Leute Gruppe ihre Felder zusammen, oder d o sie setzen sie mit den Eigenschaften? Oder sorgen sich Menschen nicht um eine Bestellung? Visual Studio scheint es so schwer zu machen.

bearbeiten: Verschoben anderen Teil über ReSharper hier: Make Resharper respect your preference for code order.

+0

Sie können XArrange 2012 verwenden, es ist kostenlos. Download verfügbar unter: http://visualstudiogallery.msdn.microsoft.com/43a29648-409a-4225-988c-a64d01eb8386 Methode, Eigenschaft usw. Sortierung ist möglich ... –

Antwort

51

I neigen Microsoft StyleCop, zu verwenden, die einen Satz aufweist, um nach SA1201 herrschen:

Ursache Ein Element innerhalb einer C# Code Datei außerhalb der Reihenfolge in Bezug auf den anderen Elementen in der IS Code.

Regelbeschreibung Eine Verletzung dieser Regel tritt auf, wenn die Codeelemente innerhalb einer Datei folgen keinen Standard Ordnungsschema.

mit dieser Regel entsprechen, Elemente in die Datei Root-Ebene oder innerhalb eines Namensraumes muss in den folgenden Reihenfolge positioniert werden:

  • Mit Richtlinien

    • Externe Alias-Richtlinien
    • Namespaces
    • Delegierte
    • Enums
    • Schnittstellen
    • Structs
    • Klassen

    Innerhalb einer Klasse, Struktur oder Schnittstelle müssen Elemente in der folgenden Reihenfolge positioniert werden:

    • Felder
    • Konstrukteurs
    • Finalizer (Destruktoren)
    • Delegierten
    • Events
    • Aufzählungen
    • Schnittstellen
    • Eigenschaften
    • Indexer
    • Methoden
    • Structs
    • Klassen

    Einhaltung einer NormBestellungSchema basierend auf Elementtyp kann erhöhen die Lesbarkeit und Wartbarkeit der Datei und ermutigen Code Wiederverwendung.

    Bei der Implementierung einer Schnittstelle ist es manchmal wünschenswert, alle Mitglieder der Schnittstelle neben einem anderen zu gruppieren. Dies erfordert manchmal eine Verletzung dieser Regel durch , wenn die Schnittstelle Elemente verschiedener Typen enthält. Dieses Problem kann durch die Verwendung von Teilklassen gelöst werden.

    1. das partielle Attribut der Klasse hinzufügen, wenn die Klasse nicht bereits Teil ist.

    2. Fügen Sie eine zweite Teilklasse mit dem gleichen Namen hinzu. Es ist möglich, in derselben Datei zu platzieren, direkt unter der ursprünglichen Klasse oder innerhalb einer zweiten Datei.

    3. Verschieben Sie die Schnittstelle Vererbung und alle Mitglieder der Schnittstelle Implementierung in den zweiten Teil der Klasse.

  • +1

    Leider StyleCop auch zusätzliche Ordnungsregeln hat, die diese Struktur als auch beeinflussen. Zum Beispiel empfiehlt es, dass statische Elemente alle zusammen gruppiert werden. –

    +1

    Ich persönlich halte das für eine gute Sache ... aber ich kann durchaus Argumente gegen verstehen. – chills42

    7

    Ich denke, es gibt keinen besten Weg. Wenn es um Layout geht, sind zwei wichtige Dinge zu beachten. Das Wichtigste ist die Konsistenz. Wählen Sie einen Ansatz und stellen Sie sicher, dass das gesamte Team zustimmt und das Layout anwendet. Zweitens, wenn Ihre Klasse groß genug wird, dass Sie suchen, wo diese lästigen Eigenschaften leben (oder Regionen implementieren müssen, damit sie einfacher zu finden sind), dann ist Ihre Klasse wahrscheinlich zu groß. Berücksichtigen Sie das Schnüffeln und Refaktorieren basierend auf dem, was Sie riechen.

    die Reshaper Frage zu beantworten, überprüft unter Typ Mitglieder Layout- in Optionen (unter den C# Knoten). Es ist nicht einfach, aber es ist möglich, die Layout-Reihenfolge zu ändern.

    +0

    Dank, sorry, ich habe den Nachschärfer Teil der Frage basierend auf JaredPar verschoben Feedback. Veröffentlichen Sie Ihren zweiten Teil der Antwort dort und ich gebe Ihnen eine weitere Abstimmung. – Ray

    +0

    In Regionen geht es auch darum, eine konsistente Struktur einzuführen (besonders in diesem Zusammenhang). –

    +0

    @scott stimmte zu, aber sie werden viel notwendiger, wenn die Klassendatei größer wird. Der Verlauf der Schlechtigkeit ist: 1) keine Regionen, 2) Regionen, 3) Teilklassen –

    1

    Ich neige dazu, private Daten zu klumpen und neigen dazu, verwandte Methoden/Eigenschaften in funktionellen Gruppen zu verklumpen.

    public class Whatever { 
        // private data here 
        int _someVal = kSomeConstant; 
    
        // constructor(s) 
        public Whatever() { } 
    
    #region FabulousTrick // sometimes regionize it 
        // fabulous trick code 
        private int SupportMethodOne() { } 
        private double SupportMethodTwo() { } 
        public void PerformFabulousTrick(Dog spot) { 
         int herrings = SupportMethodOne(); 
         double pieces = SupportMethodTwo(); 
         // etc 
        } 
    #endregion FabulousTrick 
        // etc 
    } 
    
    0

    Was auch immer Ihre produktiver macht. Einige mögen private Felder neben Eigenschaftenaccessoren, manche Felder über den Konstruktoren. Das Größte, was helfen kann, ist das Gruppieren von "Like" -Elementen. Ich persönlich mag es, private Methoden, private Immobilien usw. zusammen zu bringen.

    Probieren Sie einige Dinge aus und wieder, was auch immer Sie fühlen, macht Sie produktiver und hilft Ihnen, Ihren Code zu erhalten.

    2

    Ich glaube nicht, Regionen sind unbedingt ein Zeichen für schlechten Code. Aber um festzustellen, dass Sie überprüfen müssen, was Sie haben. Wie ich gesagt habe here ist das wie ich meinen Code regionalisieren.


    Aufzählungen
    Erklärungen
    Konstrukteurs
    Methoden
    Ereignisbehandlungsroutinen
    Eigenschaften

    Aber die Hauptsache ist es konsequent und zielstrebig zu halten.

    +2

    Ich sehe (groß) Regionen in erster Linie als Indikator in mehreren Dateien Teilklassen zu verwenden. Ein allgemeines Beispiel besteht darin, alle Daten in einer Datei und Algorithmen in einer anderen Datei zu speichern. Das ebnet auch den Weg für die Spaltung der Klasse. –

    +1

    Ich liebe Events-Eigenschaften Duo kommt über Methoden :) – nawfal

    +1

    @DavidSchmitt zu sehen: (Ich weiß, dieser Beitrag ist ziemlich alt, aber ..) wäre keine große Region (oder Klasse) mehr ein Indikator für Code Refactoring? – Paul

    0

    Jeder zu ihren eigenen, aber ich neige dazu, der gleichen Reihenfolge zu folgen, dass die MSDN-Hilfe folgt.

    Ich mag auch nicht Klassen oder enums verschachteln, sondern separate Dateien für sie erstellen, die auch Schreibgerät Tests erleichtert (da es leicht ist, die zugehörige Testdatei zu finden, wenn Sie/hinzufügen/reparieren/a Prüfung).

    IMHO die Reihenfolge ist nicht so wichtig, weil VS macht es sehr einfach, alle Mitglieder zu finden (vor allem, wenn Sie die eine Klasse/Schnittstelle/enum pro Datei Ansatz folgen), und Sandcastle wird sie gruppieren, wenn Sie Dokumente erstellen möchten , also würde ich mehr darauf achten, ihnen sinnvolle Namen zu geben.

    +0

    Reihenfolge ist immer noch wichtig, weil Konsistenz eingeführt wird. Indem Sie in all Ihren Klassen immer demselben Layout folgen, wird es einfacher, Dinge zu finden. –

    +0

    Das ist mein Punkt über VS, wenn Sie durch die Quelle der Navigation, anstatt durch die Mitglieder der Dropdown-Liste, dann für jede nicht-triviale Klasse, verschwenden Sie Zeit. Lesezeichen beschleunigen auch den Wechsel zwischen Mitgliedern und/oder Typen. Zustimmen auf Konsistenz, weshalb ich MSDN Ordnung folgen :) – si618

    0

    Oben einen einheitlichen Satz von Regionen in Klassendateien zu halten, halte ich alle Komponenten einer Region in alphabetischer Reihenfolge. Ich habe ein bisschen "visuelles Gedächtnis", wenn es darum geht, Code zu lesen, und es macht mich verrückt, das Navigations-Dropdown zu verwenden, um Code in einer Datei zu finden, weil es überall ist.

    0

    Ich benutze das folgende Layout:

    Ereignisse Globals/Klasse-weiten Felder private/interne Eigenschaften Methoden public/protected Eigenschaften Methoden verschachtelte Klassen (obwohl ich versuchen, diese zu vermeiden, wann immer möglich)

    Ich glaube auch fest an 1 Code "Sache" (Klasse, Schnittstelle oder enum) pro Datei, mit dem Dateinamen der gleiche wie der "Ding" Name. Ja, es macht ein größeres Projekt, aber es macht es unendlich leichter Dinge zu finden.

    1

    Sie können versuchen, Regionerate mit diesem zu helfen. Ich mag es sehr und es ist ein Scott Hanselman Pick.

    1

    Wie gesagt, ich glaube nicht, dass es einen besten Weg als solcher gibt. Aber eine Organisation hilft dir als Programmierer.

    Wie oft haben Sie in einem langen Projekt Zeit damit verbracht, eine oder mehrere Quelldateien hoch und runter zu gehen, um eine Ihrer Funktionen zu finden.

    Also mache ich Gebrauch des #region viel in dieser Art und Weise -

    1. Region Event: Alle der Veranstaltung Referenzen, die diese Klasse verwendet (zumindest in diesem Teilklasse) .

    2. Region Steuerelemente: Alle Funktionen, die direkt mit Steuerelementen in einem Formular interagieren.

    3. Region MDI: die mdi einrichten

      Dann wird es einige geben, mit Funktionalität als Schnittstelle eher zu tun,

    4. Region Regex

    I sort sucht Ich mache es so, wie ich es mache, benutze aber immer dasselbe Muster. Ich muss sagen, dass mir von einigen Programmierern gesagt wurde, dass sie meine Arbeit aufnehmen, dass es einfach zu folgen ist und andere, dass es unordentlich ist.

    Sie können die Hälfte der Zeit halber und die andere Hälfte ein Viertel der Zeit und das andere Viertel der Zeit Sie verwirren alle einschließlich Sie selbst. Ich denke, Winston Chrchil hat das gesagt.