web-dev-qa-db-ja.com

静的クラスコンストラクターにパラメーターを渡す方法

静的コンストラクターを持つ静的クラスがあります。どういうわけか、この静的クラスにパラメーターを渡す必要がありますが、最善の方法がどのようであるかはわかりません。あなたは何をお勧めします?

public static class MyClass {

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

静的コンストラクターを使用せず、静的初期化メソッドを使用します。

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

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

C#では、静的コンストラクターにはパラメーターがなく、この制限を克服する方法はほとんどありません。 1つは、上記で提案したことです。

30

MSDNによると、 最初のインスタンスが作成される前にクラスを初期化するために静的コンストラクターが自動的に呼び出されます 。したがって、パラメーターを送信することはできません。

CLRは、どのパラメーターを渡すかをどのように知るのか、静的コンストラクターを呼び出す必要がありますか?

したがって、静的コンストラクターを使用しないでください。

これが要件の回避策です。

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;
  } 
}

静的コンストラクターには次のプロパティがあります。

  • 静的コンストラクターは、アクセス修飾子を受け取らず、パラメーターも持ちません。静的コンストラクターは、最初のインスタンスが作成されるか、静的メンバーが参照される前に、クラスを初期化するために自動的に呼び出されます。
  • 静的コンストラクターを直接呼び出すことはできません。
  • ユーザーは、プログラムで静的コンストラクターを実行するタイミングを制御できません。
  • 静的コンストラクターの一般的な使用法は、クラスがログファイルを使用しており、コンストラクターを使用してこのファイルにエントリを書き込む場合です。
  • 静的コンストラクターは、コンストラクターがLoadLibraryメソッドを呼び出すことができる場合、アンマネージコードのラッパークラスを作成するときにも役立ちます。
  • 静的コンストラクターが例外をスローした場合、ランタイムは2度目に例外を呼び出しません。また、プログラムが実行されているアプリケーションドメインの有効期間中、型は初期化されません。
4
Rahul Nikate

「HardCodedParameter」で実際にハードコーディングされている場合は、定数を使用できます。

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);
    }
}

また、静的な読み取り専用プロパティを使用できます。

0
Mateusz Myślak