wake-up-neo.net

Wie übergeben Sie den Parameter an einen statischen Klassenkonstruktor?

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

public static class MyClass {

    static MyClass() {
        DoStuff("HardCodedParameter")
    }
}
19
MrProgram

Verwenden Sie keinen statischen Konstruktor, sondern eine statische Initialisierungsmethode:

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

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

In C # sind statische Konstruktoren ohne Parameter, und es gibt nur wenige Ansätze, um diese Einschränkung zu überwinden. Eines ist, was ich Ihnen oben vorgeschlagen habe.

28

Gemäß MSDN wird der statische Konstruktor A automatisch aufgerufen, um die Klasse zu initialisieren, bevor die erste Instanz erstellt wird . Daher können Sie keine Parameter senden.

CLR muss einen statischen Konstruktor aufrufen. Woher weiß es, welche Parameter übergeben werden sollen?

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 akzeptiert keine Zugriffsmodifizierer oder Parameter. Ein statischer Konstruktor wird automatisch zu .__ aufgerufen. Initialisieren Sie die Klasse, bevor die erste Instanz oder ein beliebiges .__ erstellt wird. statische Member werden 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.
  • Statische Konstruktoren werden normalerweise verwendet, wenn die Klasse eine Protokolldatei verwendet und der Konstruktor zum Schreiben von Einträgen in diese Datei verwendet wird.
  • Statische Konstruktoren sind auch hilfreich beim Erstellen von Wrapper-Klassen für nicht verwalteten Code, wenn der Konstruktor die LoadLibrary .__ aufrufen kann. Methode.
  • Wenn ein statischer Konstruktor eine Ausnahme auslöst, ruft die Laufzeitumgebung diese nicht ein zweites Mal auf, und der Typ bleibt für .__ nicht initialisiert. die Lebensdauer der Anwendungsdomäne, in der sich Ihr Programm befindet Laufen.
3
Rahul Nikate

Wenn Sie mit "HardCodedParameter" wirklich hart codiert meinen, 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.

0
Mateusz Myślak