2014-02-05 64 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(); 
    } 
} 
相关问题