2014-02-05 8 views
2

меня спросили в интервью:Как вызвать статический конструктор вне класса?

public class Test 
{ 
    static Test(){} 
} 

public class Class1 
{ 
    //Call static constructor Here 
} 

Я пытался позвонить статический конструктор внутри конструктора базового класса. но это не похоже на правильное направление. Как ты делаешь это?

+1

Статический конструктор вызывает неявно , когда вы получаете доступ к любому статическому свойству или методу или созданию экземпляра. – vmeln

+0

Доступ к любому другому статическому члену класса или создание экземпляра класса и *, если ничто другое не вызвало его уже *, чем будет вызван статический конструктор. Вам никогда не придется заставлять это случиться. –

ответ

6

Вы не можете вызвать статический конструктор, и вы не можете указать его видимость (public)

От documentation:

Статический конструктор вызывается автоматически для инициализации класса до первого экземпляра или любые статические члены - это .

1

Статические конструкторы не называть явно, они инициализируются перед первым экземпляром создается, следовательно, не могут быть отправлены параметры

1

Microsoft заявляет

Статический конструктор не может быть вызван непосредственно.

Referance here

2

Статические конструкторы вызываются автоматически перед любым использованием класса и не должен быть вызван вручную, так что правильный ответ, чтобы сделать что-то на Test класс, как:

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

Но в 99% случаев вам все равно, время выполнения вызовет его при необходимости.

В некоторых случаях (например, для принудительной инициализации во время запуска, чтобы он не выполнялся во время использования приложения или в SetUp некоторых модульных тестов), вам может потребоваться его принудительное.

Класс RuntimeHelpers обеспечивают эту возможность:

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

PS: Название RunClassConstructor вводит в заблуждение его запустить, только если она не запускали

PS (2): Я не» t знать точный вопрос, но если интервьюер говорил о конструкторе базового класса (Class1 : Test), это бесполезно, так как никакой код в производном классе никогда не будет вызван без вызываемого ранее статического конструктора базового класса.

+0

+1 для VBFox для RuntimeHelpers.RunClassConstructor – 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(); 
    } 
} 
Смежные вопросы