2014-02-05 89 views
2

有人問我在採訪時說:如何在類之外調用靜態構造函數?

public class Test 
{ 
    static Test(){} 
} 

public class Class1 
{ 
    //Call static constructor Here 
} 

我想調用基類的構造函數中靜態構造函數。但這似乎並不正確。你怎麼做呢?

+1

靜態構造函數調用隱,當你訪問任何靜態屬性或方法或創建實例時。 – vmeln

+0

訪問該類的任何其他靜態成員,或創建該類的一個實例,並且*如果沒有其他任何事情導致它已經發生*,則會調用靜態構造函數。你永遠不需要強迫這種事情發生。 –

回答

6

不能調用靜態構造函數,而不能指定其可見性(public

documentation

靜態構造函數是自動調用的第一個實例之前初始化類 創建或任何靜態成員 引用。

1

靜態構造函數沒有被顯式調用,在創建第一個實例之前,因此不能被髮送的參數

它們被初始化
1

微軟聲稱

靜態構造函數不能直接調用。

全球化志願服務青年here

2

靜態構造函數類的任何使用前被自動調用,不應該因此正確答案是做什麼的Test類像手動調用:

public class Class1 
{ 
    public void CallStaticConstructorHere() 
    { 
     new Test(); 
    } 
} 

但99%的時間你不應該在意,運行時會在需要時調用它。

在某些情況下(如在啓動過程中迫使一些初始化,使其不發生應用程序使用,或者在一些單元測試在安裝過程中後者),你可能需要強制它。

RuntimeHelpers提供這種能力:

public class Class1 
{ 
    public void CallStaticConstructorHere() 
    { 
     RuntimeHelpers.RunClassConstructor(typeof(Test).TypeHandle); 
    } 
} 

PS:RunClassConstructor是誤導它運行它,只有當它尚未運行

PS(2)名稱:我不t知道確切的問題,但是如果面試官講的是基類構造函數(Class1 : Test),那麼它就沒用了,因爲如果沒有在之前調用基類靜態構造函數的情況下,將不會調用派生類中的任何代碼。

+0

對於RuntimeHelpers.RunClassConstructor的VBFox +1 – AlexH

0

這很容易。

雖然你不能直接調用靜態構造函數(大家都知道),你可以知道什麼是叫...通過訪問這個類..靜態構造函數(這將使聲明call static constructor here有效的,如果有什麼訪問該類別中沒有其他靜態構造函數)< <我可以從那些誰也不會明白寫在括號= d趴下-票

public class Test 
{ 
    static Test(){} 
} 

public class Class1 
{ 
    //Call static constructor Here 
    static Class1() 
    { 
     // yes sir! 
     var test = new Test(); 
    } 
} 
相關問題