有人問我在採訪時說:如何在類之外調用靜態構造函數?
public class Test
{
static Test(){}
}
public class Class1
{
//Call static constructor Here
}
我想調用基類的構造函數中靜態構造函數。但這似乎並不正確。你怎麼做呢?
有人問我在採訪時說:如何在類之外調用靜態構造函數?
public class Test
{
static Test(){}
}
public class Class1
{
//Call static constructor Here
}
我想調用基類的構造函數中靜態構造函數。但這似乎並不正確。你怎麼做呢?
靜態構造函數沒有被顯式調用,在創建第一個實例之前,因此不能被髮送的參數
它們被初始化靜態構造函數類的任何使用前被自動調用,不應該因此正確答案是做什麼的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
),那麼它就沒用了,因爲如果沒有在之前調用基類靜態構造函數的情況下,將不會調用派生類中的任何代碼。
對於RuntimeHelpers.RunClassConstructor的VBFox +1 – AlexH
這很容易。
雖然你不能直接調用靜態構造函數(大家都知道),你可以知道什麼是叫...通過訪問這個類..靜態構造函數(這將使聲明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();
}
}
靜態構造函數調用隱,當你訪問任何靜態屬性或方法或創建實例時。 – vmeln
訪問該類的任何其他靜態成員,或創建該類的一個實例,並且*如果沒有其他任何事情導致它已經發生*,則會調用靜態構造函數。你永遠不需要強迫這種事情發生。 –