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

Я хотел бы выполнить статического конструктора класса (т.е. Я хочу "загрузить" класс), не создавая экземпляр. Как я делаю это?

Вопрос о премии: Есть ли какие-либо различия между.NET 4 и более старыми версиями?

Править:

  • Класс не статичен.
  • Я хочу выполнить его прежде, чем создать экземпляры, потому что это требует времени к выполненному, и я хотел бы избежать этой задержки в первом доступе.
  • Статический ctor инициализирует private static readonly поля таким образом не могут быть выполнены в методе вместо этого.
41
задан mafu 16 April 2010 в 15:29
поделиться

6 ответов

Другие ответы превосходны, но если вам нужно принудительно запустить конструктор класса без ссылки на тип (например, отражение), вы можете использовать:

Type type = ...;
System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(type.TypeHandle);
106
ответ дан 27 November 2019 в 00:10
поделиться

В этом нет необходимости, весь смысл статического конструктора в том, что он запускается один раз при первой инициализации класса при первом доступе. Если вы хотите запускать что-то по запросу, рассмотрите возможность добавления кода инициализации в общедоступный метод, который вызывается конструктором. Затем вы можете вызвать этот метод, когда захотите.Но я не уверен , почему вам это нужно?

-1
ответ дан 27 November 2019 в 00:10
поделиться

cctor (статический конструктор) будет вызываться всякий раз, когда происходит одно из следующих событий:

  1. Вы создаете экземпляр класса
  2. Любой статический член осуществляется доступ
  3. В любое время до этого, если BeforeFieldInit установлен

Если вы хотите явно вызвать cctor, предполагая, что у вас есть другие статические члены, просто вызовите / получите к ним доступ.

Если вы не делаете ничего очень интересного в своем cctor, компилятор может решить пометить его BeforeFieldInit , что позволит CLR выполнить функцию раньше. Более подробно это объясняется здесь: http://blogs.msdn.com/davidnotario/archive/2005/02/08/369593.aspx

6
ответ дан 27 November 2019 в 00:10
поделиться

Как говорили другие, статические конструкторы запускаются автоматически. Если вам нужно быть явным, может быть, вам следует преобразовать его в статический метод, который можно запустить явно?

Явный вызов статического метода, конечно же, также обеспечит выполнение статического конструктора.

править

Статические конструкторы запускаются, когда ссылаются на какие-либо статические члены . Вы можете просто создать фиктивный метод с именем initialize , который ничего не делает, кроме как гарантировать, что структура вызывает статический конструктор.

-1
ответ дан 27 November 2019 в 00:10
поделиться

Статический конструктор запускается автоматически при первом обращении к классу. Нет необходимости (или возможности) «запускать» его самостоятельно.

-3
ответ дан 27 November 2019 в 00:10
поделиться

Просто укажите одно из ваших статических полей. Это заставит ваш статический код инициализации запуститься. Например:

public class MyClass
{
    private static readonly int someStaticField;

    static MyClass() => someStaticField = 1;

    // any no-op method call accepting your object will do fine
    public static void TouchMe() => GC.KeepAlive(someStaticField);
}

Использование:

// initialize statics
MyClass.TouchMe();
17
ответ дан 27 November 2019 в 00:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: