Как вызвать статический конструктор вне класса?

2 Neeraj Verma [2014-02-05 18:27:00]

Меня спросили в интервью:

public class Test
{
    static Test(){}
}

public class Class1 
{
    //Call static constructor Here
}

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

c# .net static


5 ответов


6 Alberto [2014-02-05 18:29:00]

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

Из документации:

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


2 Julien Roncaglia [2014-02-05 18:34:00]

Статические конструкторы вызываются автоматически перед любым использованием класса и не должны вызываться вручную, поэтому правильный ответ заключается в том, чтобы что-то сделать в классе 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): Я не знаю точного вопроса, но если интервьюер говорил о конструкторе базового класса (Class1: Test), это бесполезно, поскольку никакой код в производном классе никогда не будет вызван без статического конструктора базового класса, называемый ранее.


1 Kuzgun [2014-02-05 18:31:00]

Microsoft заявляет

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

Ссылка здесь


1 Michael B [2014-02-05 18:30:00]

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


0 Sinatr [2014-02-05 18:37:00]

Это легко.

Хотя вы не можете напрямую вызвать статический конструктор (как известно), вы можете удостовериться, что он называется... путем доступа к этому классу из статического конструктора (который должен сделать оператор- 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();
    }
}