2010-11-29 5 views
5

Ich erstelle eine Suchklasse, so dass in allen Projekten ein konstanter Wert verwendet wird. Die Sache ist, es gibt mehrere Lösungen, um so etwas zu schaffen. Ich könnte eine einzelne Klasse mit Enums, Strukturen oder Konstanten darin erstellen oder eine einzelne Klasse für jedes 'Objekt' erstellen. Ich frage mich, was wäre die beste Lösung.Suchklasse verwenden enum, struct, public const, etwas anderes?

Zuerst dachte ich, so etwas wie dies zu tun:

public static class Defines 
    { 
     public enum PAGELAYOUT_NAMES 
     { 
      STANDARD = "Standard" 
     } 
    } 

Aber persönlich mag ich nicht Strings in Aufzählungen, die viel mit. Eine andere Möglichkeit wäre, eine Struktur zu verwenden, die, wenn Sie den Code sehen noch hässlich ist:

public static class Defines 
    { 
     public struct PAGELAYOUT_NAMES 
     { 
      public static string STANDAARD = "Standaard"; 
     } 
    } 

Dieses etwas besser aussieht, könnte aber verwirrend sein, wenn eine Menge von Optionen mit:

public static class Defines 
{ 
     public const string PAGELAYOUT_NAMES_STANDARD = "Standard"; 
} 

public static class PageLayout 
{ 
    public const string STANDARD = "Standard"; 
} 

Alle anderen Vorschläge:

Während diesen Beitrag eingeben, ich denke, das wird die beste Option/clean sein? Das Auffüllen des Projekts mit mehreren Klassen, die nur einige Konstanten definieren, scheint mir wie viel Overhead und Unordnung.

Bearbeiten Es war nicht sehr klar im ursprünglichen Kontext, aber die Lookup-Werte sind nicht auf Strings beschränkt. Einige sehr gute Vorschläge sind nur möglich, wenn Sie nur Strings verwenden, aber Int's, DateTime und andere Typen müssen ebenfalls unterstützt werden. Hab ein paar nette Ideen aus den Antworten hier, ich werde ausprobieren, welche am besten in meinem aktuellen Projekt funktionieren wird.

Finale implementierte Lösung Dank der Vorschläge unten, habe ich die Lookup-Klassen wie folgt umgesetzt:

internal class Base<T> 
    { 
     internal T Value{ get; private set;} 
     internal Base(T value) 
     { 
      Value = value; 
     } 
    } 
    public class PageLayout 
    { 
     public static string Standard { get { return new Base<string>("Standard").Value; } } 
    } 

Dies beruht auf einer Antwort weiter unten. Grund ist, weil ich jetzt dies für Nicht-Strings & Integer auch verwenden kann, was nicht wirklich möglich ist mit einer enum mit einer Beschreibung und einer Ressource-Datei, obwohl das für mich sauberer fühlen würde.

Antwort

2

Ich bevorzuge diesen Weg mit einer Fabrik Stil statischen Eigenschaften. Aber es kommt auf das genaue Szenario an. Sie können string oder enum als Feld verwenden.

public class PageLayout 
    { 
     private readonly string LayoutType; 
     private PageLayout(string layoutType) 
     { 
      LayoutType = layoutType; 
     } 
     public static Standard {get {return new PageLayout("Standard");}} 
    } 

Dann Code Verwendung PageLayout.Standard

+0

Obwohl ich die Reinheit von Iain Galloway seinen Vorschlag mag, habe ich diese implementiert, weil Sie auch nicht-String-und Integer-Werte wie Guids hinzufügen können, DateTime usw. –

4

Je nachdem, was genau Sie tun, möchten Sie wahrscheinlich Resources betrachten.

Sie definieren eine XML-Datei (oder verwenden Sie den Designer, um Ihnen zu helfen), und es wird in eine Assembly kompiliert (entweder eingebettet oder eine "Satellitenassembly").

Klicken Sie mit der rechten Maustaste auf den Eigenschaftenknoten unter Ihrer Klassenbibliothek im Lösungsexplorer, klicken Sie auf "Öffnen", und wechseln Sie zur Registerkarte Ressourcen. Es ist ziemlich einfach, von dort anzufangen.

Sobald es eingerichtet ist, ist es einfach an den Werten von Code beispiel zu erhalten: -

String s = Resources.PageLayoutNames.Standard; 

Es gibt ein paar Komplikationen, aber ohne mehr über Ihre App zu wissen, kann ich nicht mehr beraten. Wenn Sie ASP.NET-Anwendungen testen, müssen Sie sicherstellen, dass die Ressource eingebettet und nicht als Satellit bereitgestellt wird. Andernfalls funktionieren die Komponententests nicht.

Sie werden auch für die Globalisierung verwendet, daher ist es gut, sich mit ihnen vertraut zu machen.


Edit:

Alternativ nach wieder Ihre Frage lesen, ich bin geneigt zu fragen: „Was tun Sie für überhaupt die Zeichenfolge brauchen?“.

Was machst du, was du nicht mit einem Enum machen kannst?

Wenn Sie versuchen, Text für die Anzeige zu einem Enum-Typ abzubilden, gibt es eine Reihe von Möglichkeiten, z. von using the DescriptionAttribute

enum PageLayouts 
{ 
    [Description("Standard")] 
    Standard, 
    [Description("Extra Awesome")] 
    ExtraAwesome 
} 

Sie können nicht die Description einen Ressourcenschlüssel aus der Box geben, though. You have to subclass it if you want to support globalisation...

0

Die Leute raten von öffentlichen verschachtelten Klassen ab, daher sollte Defines in Ihren früheren Beispielen eher ein Namespace als eine äußere Klasse sein.

0

in Aufruf Ich benutze immer den

public static class PageLayout 
{ 
    public const string STANDARD = "Standard"; 
} 

Ansatz.

Ich schaffe aber mehr Klassen als ein: Wenn ich eine Menge sessionvariables verwenden, ich erstellen (public static)

class SessionNames 

und ich mache einen Unterschied zwischen soultion breit Konstanten und Projekt breite Konstanten machen.

manchmal haben die Konstanten für ein Projekt (zum Beispiel 20 Platzhalter in einem PDF, das du erstellen musst) nichts mit den anderen Projekten zu tun, also mache ich eine Projektklasse, aber wenn ich lösungsweite Konstanten habe, erstelle ich eine Klasse an der gleichen Stelle wie ich meine String-Erweiterungen etc.

+2

Sie müssen sehr vorsichtig sein, wenn Sie "const" -Werte verwenden. Sie werden als Literale in referenzierende Assemblies kompiliert. Das heißt, wenn sich der konstante Wert ändert, müssen Sie * alle * Ihre DLLs re-kombinieren, nicht nur die, die die geänderte Konstante enthielten. Siehe die Notiz hier: - http://msdn.microsoft.com/en-us/library/ms173119.aspx –

+0

@lain: Danke, wusste das nicht – Michel

Verwandte Themen