2010-06-24 11 views
36

Ich versuche, mich an allgemeine Namenskonventionen wie die in Design Guidelines for Developing Class Libraries beschriebenen zu halten. Ich gebe jeden Typ in seine eigene Quelldatei ein (und Teilklassen werden auf mehrere Dateien aufgeteilt, wie in Frage Naming Conventions for Partial Class Files beschrieben), wobei der Name des Typs als Dateiname verwendet wird.So benennen Sie C# Quelldateien für generische Klassen

Beispiele:

namespace Demo.Bla       // project 
{ 
    enum FlowDirection { }     // in file FlowDirection.cs 
    class LayoutManager { }    // in file LayoutManager.cs 
} 

namespace Demo.Bla.LayoutControllers  // folder LayoutControllers in project 
{ 
    class StackPanelLayoutController { } // in file LayoutControllers/StackPanelLayoutController 
} 

Aber ich bin nicht sicher, ich habe mit einem cleveren Weg der Namensgebung Quelldateien kommen, die generischen Klassen enthalten. Sagen Sie, dass ich folgende Klassen, zum Beispiel haben:

namespace Demo.Bla.Collections    // folder Collections 
{ 
    class Map<T> { }      // in file Map.cs (obviously) 
    class Bag { }       // in file Bag.cs (obviously) 
    class Bag<T> : Bag { }     // also in file Bag.cs ??? 
} 

Sollte ich sowohl den Code des nicht-generic setzen und den allgemeinen Bag Klassen in die gleiche Bag.cs-Datei? Was sind deine Gewohnheiten?

+1

Große Frage. – Marcel

+1

Mögliche dup: http://stackoverflow.com/questions/2611639/what-should-i-name-my-files-with-generic-class-definitions – Jehof

+1

@Jehof: verwandt, aber nicht eine dup. Dies ist eine generische/nicht-generische Frage (und auch eine Namenskonvention). –

Antwort

1

Im CoreFX GitHub Repository wird Microsoft nach der zurück-tick Konvention beschrieben in Matthias Jakobsson ‚Antwort s:

enter image description here

Also im Grunde:

class ImmutableArray { }      // ImmutableArray.cs 
class ImmutableArray<T> { }     // ImmutableArray`1.cs 
... 
class ImmutableDictionary<TKey, TValue> { } // ImmutableDictionary`2.cs 

Und für Klassen, die in anderen Klassen definiert sind, wird der Name von der Außen Klasse von + und durch den Namen der inneren Klasse gefolgt (Outer+Inner.cs):

partial class ImmutableArray<T>    // ImmutableArray`1+Builder.cs 
{ 
    class Builder { } 
} 
+2

Ich weiß, dass dies ein Jahr alt ist, aber ich möchte darauf hinweisen, dass dieser Ansatz für die Benennung in der von Ihnen bereitgestellten CoreFX-Verknüpfung nicht mehr verwendet wird. Sie verwenden jetzt einen Unterstrich anstelle eines Zeigers und einen Punkt anstelle eines Pluszeichens. Also wäre das 'ImmutableArray'1 + Builder.cs' jetzt 'ImmutableArray_1.Builder.cs' –

5

Normalerweise, wenn ich mehrere Typen durch die Anzahl der Typparameter "überladen" habe, ist es entweder, weil das eine von dem anderen abgeleitet ist, oder das andere verwendet wird. Ich lege sie einfach in die gleiche Datei. Eine alternative Option wäre, sie in verschiedene Dateien aufzuteilen, eine Datei als "primäre" Datei zu definieren, und die anderen "hängen" davon in der Build-Datei ab, wie in der Teilklassenfrage, die Sie in der Frage verknüpft haben .

Auf diese Weise können Sie in Visual Studio eine visuelle Verknüpfung erstellen, aber immer noch eine Klasse pro Datei, um die Arbeit mit ihnen zu erleichtern.

0

Ich füge den Namen meiner generischen Klassen ein Suffix 'T' hinzu.

class Bag { }       // in file Bag.cs 
class BagT<T> : Bag { }     // in file BagT.cs 
class BagInputs : BagT<Input>   // in file BagInputs.cs 

Sie gefragt,

Sollte habe ich den Code sowohl der nicht-generischer und generischen Tasche Klassen in die gleiche Bag.cs-Datei? Was sind deine Gewohnheiten?

Die oben genannte Konvention von mir ist nicht Standard; Ich sollte klarstellen, dass ich antwortete "Was sind meine Gewohnheiten" und nicht unbedingt "Was Sie tun sollten".

+4

Das scheint mir etwas ungewöhnlich zu sein. Was hätten Sie getan, wenn Sie die 'Tuple'-Typen in .NET 4 entworfen hätten? –

+1

@Jon - Ja, ungewöhnlich: Ich verwende einige nicht-standardisierte Namenskonventionen, nicht unbedingt so wie die Namenskonventionen der .NET-Bibliothekstypen. Ich habe diese 'Tuple'-Typen noch nicht kennengelernt, aber ich würde sie wohl alle' TupleT' im selben 'TupleT.cs' genannt haben. – ChrisW

+1

Interessant; Danke für die Idee, aber ich mag es nicht sehr. Es passt nicht mit allen anderen generischen Typen, die in .NET verwendet werden ('List ' würde 'ListT ' werden, was sich für mich wirklich peinlich anfühlt). –

38

Ich denke, die gemeinsame Lösung für dieses Problem, die Datei wie folgt zu nennen ist:

{ClassName}`{NumberOfGenericParameters} 

Dies würde Sie diesen Dateinamen geben:

Bag.cs and Bag`1.cs 

Dies ist die Art und Weise Microsoft dieses Problem umgehen in Frameworks wie Asp.net Mvc.

+0

Oh, ich hatte nicht erkannt, dass der Backtick ein rechtliches Zeichen in Dateinamen ist (zumindest unter Windows). Dies bedeutet, dass jeder generische Typ einen Backtick und eine Nummer in seinem Namen haben sollte. Hmmm, ich muss darüber nachdenken. Vielen Dank. –

+1

@Pierre, Ja. So löse ich das Problem. Wenn ich jedoch nur die generische Klasse und keine nicht-generische Version habe, lege ich normalerweise das Back-Tick-Zeichen nicht in den Dateinamen. In Ihrem Fall hätte ich also die generische Map-Klasse in einer Datei namens "Map.cs". –

+0

+1 - Dies scheint die vernünftige Konvention zu sein. – Fenton

16

Ich habe einige Bibliotheken

Bag.cs 
Bag`1.cs 
Bag`2.cs 

mit gesehen, wie das ist, was die Type.Name anzeigen würde.

möchte ich mit den Typparametern kräftigeren sein, damit ich in letzter Zeit

Bag.cs 
Bag{T}.cs 
Bag{TKey, TValue}.cs 

Dies ist ein Format, das auch durch die XML-Kommentare zu verwenden, sind in der Regel unterstützt wird.

/// <summary> 
/// ... 
/// Uses the <see cref="T:MyLibrary.Bag{TKey, TValue}" /> class. 
/// </summary> 
+0

der welten - Vielen Dank für den Vorschlag. Ich mag die Idee, die Typparameter direkt in den Dateinamen zu setzen, besser als das kürzere Benennungsschema für Back-Tick + Nummer. –

+0

Ja, dieser Ansatz scheint lesbarer zu sein. Vielen Dank. –

Verwandte Themen