2011-07-07 84 views
4

我有一個靜態類。TypeInitializationException收到

static class AppDirectory 
{ 

    public static string PACSTEMP = Path.Combine(Path.GetTempPath() ,"PacsTemp");//@"C:\MyTemp"; 

    public static string ImageTempDirectory = Path.Combine(Path.GetTempPath(), "ImageRetrieveTemp");//@"C:\ImageRetrieveTemp\"; 

    static AppDirectory() 
    { 


     if (Directory.Exists(PACSTEMP)) 
      Directory.Delete(PACSTEMP); 

     if (Directory.Exists(ImageTempDirectory)) 
      Directory.Delete(ImageTempDirectory); 

     Directory.CreateDirectory(PACSTEMP); 
     Directory.CreateDirectory(ImageTempDirectory); 
    } 
} 

它是一個靜態類,並有一個靜態構造函數。當我試圖用PACSTEMP和ImageTempDirectory變量,它顯示類型初始化錯誤。我明白,這是因爲,AppDirectory沒有初始化。

能否請你幫我,如何初始化這些類型的類。或者我錯過了OOP的規則。

謝謝

+1

切勿將可能失敗的代碼放入靜態構造函數(也稱爲類型初始值設定項)中。 –

回答

3

領域的構造函數初始化之前發生的,所以它應該是罰款。我懷疑這是一個權限錯誤。看看.InnerException看到什麼:

try { 
    // something that uses AppDirectory, causing the error 
} catch (TypeInitializationException ex) { 
    Trace.WriteLine(ex.InnerException); 
    throw; 
} 

它也可能是刪除失敗,因爲要刪除的目錄不爲空。

2

顯然你的靜態構造函數的執行過程中拋出某種異常。

the documentation of TypeInitializationException引用:

When a class initializer fails to initialize a type, a TypeInitializationException is created and passed a reference to the exception thrown by the type's class initializer. The InnerException property of TypeInitializationException holds the underlying exception.

所以,你應該看看你的TypeInitializationException的InnerException找出真正出了錯。

1

否則在靜態構造函數IO相關的代碼(打開/創建/刪除文件/文件夾),是自找麻煩 - 這樣的操作,預計相當定期失敗。

無論是捕捉所有的IOExceptions和做一些事情或更好的初始化啓動代碼,而不是構造這個對象。

閱讀的依賴注入的更好的方法來應用提供共享服務。

-3

我會問你爲什麼需要一個靜態構造函數,你可以替換靜態方法構造函數和調用靜態方法,而不是靜態構造函數。 原因: 靜態常量將被調用每次 1.呼叫 2.初始化任何sttic成員值 3.靜態類的任何方法初始化它不會被稱爲自動對象 等

,它只被調用每當您參考之類的任何成員/方法。所以,如果你有10個方法和10個變量,假設你調用所有成員只有一次(10 + 10),所以你的靜態構造函數會被調用20次。

難道你不覺得,而不是它要好得多隻需更換與靜態方法靜態構造函數和第一調用該方法在您的應用程序,讓您的目錄變量的設置。

希望這會有所幫助。如果沒有,做了一些谷歌瞭解靜態構造函數更好

REG的錯誤:我建議把一個try - catch塊,看看是什麼原因造成的除外。

+1

我相信你錯了:「非泛型類的靜態構造函數在給定的應用程序域中最多執行一次*。」 (C#語言規範,第4版,第17.11節)。 – Heinzi

+1

非常非常錯誤 –

相關問題