документация по статическим конструкторам в C # говорит:
Статический конструктор используется для инициализации любых статических данных или для выполнения определенного действия, которое необходимо выполнить только один раз. Он вызывается автоматически до создания первого экземпляра или ссылки на статические члены.
Эта последняя часть (о том, когда она вызывается автоматически) вызвала у меня зацикливание; до прочтения этой части я думал, что, просто обращаясь к классу любым способом, я мог быть уверен, что был вызван статический конструктор его базового класса. Проверка и изучение документации показали, что это не так; кажется, что статический конструктор для базового класса не гарантированно запускается до тех пор, пока не будет получен доступ к члену этого базового класса.
Теперь, я думаю, в большинстве случаев, когда вы имеете дело с производным классом, вы должны создать экземпляр, и он будет представлять собой экземпляр создаваемого базового класса, поэтому будет вызываться статический конструктор. Но если я имею дело только с статическими членами производного класса, что тогда?
Чтобы сделать это немного более конкретным, я подумал, что приведенный ниже код будет работать:
abstract class TypeBase
{
static TypeBase()
{
Type<int>.Name = "int";
Type<long>.Name = "long";
Type<double>.Name = "double";
}
}
class Type<T> : TypeBase
{
public static string Name { get; internal set; }
}
class Program
{
Console.WriteLine(Type<int>.Name);
}
Я предположил, что доступ к классу Type<T>
автоматически вызовет статический конструктор для TypeBase
; но, похоже, это не так. Type<int>.Name
равно null
, а приведенный выше код выводит пустую строку.
Помимо создания некоторого фиктивного члена (например, статического Initialize()
метода, который ничего не делает), есть ли лучший способ гарантировать, что статический конструктор базового типа будет вызываться перед использованием любого из его производных типов?
Если нет, то ... фиктивный член это!
public static string Name { get { return typeof(T).Name; } }
? - person Matt Greer   schedule 11.01.2011