2015-12-11 17 views
10

Ich habe eine statische Klasse mit einem statischen Konstruktor. Ich muss irgendwie einen Parameter an diese statische Klasse übergeben, aber ich bin mir nicht sicher, wie der beste Weg ist. Was würden Sie empfehlen?Wie übergeben Sie den Parameter an den statischen Klassenkonstruktor?

public static class MyClass { 

    static MyClass() { 
     DoStuff("HardCodedParameter") 
    } 
} 
+2

Sie haben es wahrscheinlich aus den falschen Gründen "statisch" gemacht. Redesign. –

+0

Erste Frage ist in der Tat: Warum ist diese Klasse statisch? Selten sollte es sein. –

Antwort

16

Verwenden Sie einen statischen Konstruktor nicht, aber eine statische Initialisierung Methode:

public class A 
{ 
    private static string ParamA { get; set; } 

    public static void Init(string paramA) 
    { 
     ParamA = paramA; 
    } 
} 

In C# sind statische Konstruktoren parameterlos, und es sind einige Ansätze, um diese Einschränkung zu überwinden. Einer ist, was ich dir oben vorgeschlagen habe.

0

Gemäß MSDN, A static constructor is called automatically to initialize the class before the first instance is created. Daher können Sie keine Parameter senden.

CLR muss ein statischer Konstruktor aufrufen, wie wird es wissen, welche es passieren Parameter?

Verwenden Sie also keinen statischen Konstruktor.

Hier ist die Arbeit für Ihre Anforderung.

public class StaticClass 
{ 
    private int bar; 
    private static StaticClass _foo; 

    private StaticClass() {} 

    static StaticClass Create(int initialBar) 
    { 
    _foo = new StaticClass(); 
    _foo.bar = initialBar; 
    return _foo; 
    } 
} 

Statische Konstruktoren haben folgende Eigenschaften:

  • Ein statischer Konstruktor übernimmt keine Zugriffsmodifikatoren oder Parameter. Ein statischer Konstruktor wird automatisch zu aufgerufen, um die Klasse vor der Erstellung der ersten Instanz zu initialisieren, oder es werden alle statischen Member referenziert.
  • Ein statischer Konstruktor kann nicht direkt aufgerufen werden.
  • Der Benutzer hat keine Kontrolle darüber, wann der statische Konstruktor im Programm ausgeführt wird.
  • Eine typische Verwendung von statischen Konstruktoren ist, wenn die Klasse eine Protokolldatei verwendet und der Konstruktor zum Schreiben von Einträgen in diese Datei verwendet wird.
  • Statische Konstruktoren sind auch nützlich, wenn Wrapper-Klassen für nicht verwalteten Code erstellen, wenn der Konstruktor die Loadlibrary Methode aufrufen können.
  • Wenn ein statischer Konstruktor eine Ausnahme auslöst, wird sie von der Laufzeitumgebung nicht ein zweites Mal aufgerufen, und der Typ bleibt für der Lebensdauer der Anwendungsdomäne, in der Ihr Programm läuft, nicht initialisiert.
0

Wenn von „HardCodedParameter“ Sie wirklich hart codiert bedeuten, können Sie Konstanten verwenden.

public static class YoursClass 
{ 
    public const string AnotherHardCodedParam = "Foo"; 
} 

public static class MyClass 
{ 
    private const string HardCodedParam = "FooBar"; 

    static MyClass() 
    { 
     DoStuff(MyClass.HardCodedParam); 
     DoStuff(YoursClass.AnotherHardCodedParam); 
    } 
} 

Sie können auch statische Readonly-Eigenschaften verwenden.