2015-12-11 232 views
10

我有一個靜態構造函數的靜態類。我需要傳遞一個參數到這個靜態類,但我不知道最好的方法是什麼。 你會推薦什麼?如何將參數傳遞給靜態類構造函數?

public static class MyClass { 

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

你可能是因爲錯誤的原因使它變成了靜態的。重新設計。 –

+0

第一個問題的確是:爲什麼這個類是靜態的?很少它應該。 –

回答

16

不要使用靜態構造函數,而是一個靜態初始化方法:

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

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

在C#中,靜態構造函數是無參數,而且是克服這種限制幾種方法。一個是我在上面建議你的。

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方法時。
  • 如果靜態構造函數拋出異常,則運行時不會再次調用該類型,並且該類型將保持未初始化爲運行程序的 的應用程序域的生命週期爲 。
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); 
    } 
} 

此外,您可以使用靜態只讀屬性。

相關問題