2015-12-11 20 views
10

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

public static class MyClass { 

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

あなたはたぶん間違った理由でそれを 'static'にしました。再設計。 –

+0

最初の質問は確かです:なぜこのクラスは静的ですか?まれにそれはすべきです。 –

答えて

16

は静的コンストラクタを使用しますが、静的な初期化メソッドはいけない:C#ので

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

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

、静的コンストラクタは、パラメータなしで、この制限を克服するためにいくつかのアプローチがあります。 1つは私があなたの上に示唆したものです。

0

MSDNに従って、A static constructor is called automatically to initialize the class before the first instance is created。したがって、パラメータを送信することはできません。

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回目の呼び出しを実行せず、 のプログラムが実行されているアプリケーションドメインの有効期間ではタイプが初期化されずに残ります。
0

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

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

関連する問題