Я хотел бы выполнить статического конструктора класса (т.е. Я хочу "загрузить" класс), не создавая экземпляр. Как я делаю это?
Вопрос о премии: Есть ли какие-либо различия между.NET 4 и более старыми версиями?
Править:
private static readonly
поля таким образом не могут быть выполнены в методе вместо этого.Другие ответы превосходны, но если вам нужно принудительно запустить конструктор класса без ссылки на тип (например, отражение), вы можете использовать:
Type type = ...;
System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(type.TypeHandle);
В этом нет необходимости, весь смысл статического конструктора в том, что он запускается один раз при первой инициализации класса при первом доступе. Если вы хотите запускать что-то по запросу, рассмотрите возможность добавления кода инициализации в общедоступный метод, который вызывается конструктором. Затем вы можете вызвать этот метод, когда захотите.Но я не уверен , почему вам это нужно?
cctor (статический конструктор) будет вызываться всякий раз, когда происходит одно из следующих событий:
BeforeFieldInit
установлен Если вы хотите явно вызвать cctor, предполагая, что у вас есть другие статические члены, просто вызовите / получите к ним доступ.
Если вы не делаете ничего очень интересного в своем cctor, компилятор может решить пометить его BeforeFieldInit
, что позволит CLR выполнить функцию раньше. Более подробно это объясняется здесь: http://blogs.msdn.com/davidnotario/archive/2005/02/08/369593.aspx
Как говорили другие, статические конструкторы запускаются автоматически. Если вам нужно быть явным, может быть, вам следует преобразовать его в статический метод, который можно запустить явно?
Явный вызов статического метода, конечно же, также обеспечит выполнение статического конструктора.
править
Статические конструкторы запускаются, когда ссылаются на какие-либо статические члены . Вы можете просто создать фиктивный метод с именем initialize
, который ничего не делает, кроме как гарантировать, что структура вызывает статический конструктор.
Статический конструктор запускается автоматически при первом обращении к классу. Нет необходимости (или возможности) «запускать» его самостоятельно.
Просто укажите одно из ваших статических полей. Это заставит ваш статический код инициализации запуститься. Например:
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();