Документация о статических конструкторах в C # гласит:
Статический конструктор используется для инициализации любых статических данных или для выполнения определенного действия, которое необходимо выполнить только один раз.Он вызывается автоматически перед созданием первого экземпляра или ссылками на статические элементы .
Эта последняя часть (о том, когда он вызывается автоматически) бросила меня в цикл;до прочтения этой части я думал , что простым доступом к классу любым способом я мог быть уверен, что был вызван статический конструктор его базового класса.Тестирование и проверка документации показали, что это не так;похоже, что статический конструктор для класса base не гарантированно будет работать до тех пор, пока не будет получен доступ к члену этого базового класса, в частности .
Теперь, я думаю, в большинствеВ случаях, когда вы имеете дело с производным классом, вы создаете экземпляр, и это будет представлять собой экземпляр создаваемого базового класса, поэтому будет вызван статический конструктор.Но если я имею дело только с static членами производного класса, что тогда?
Чтобы сделать это немного более конкретным, я подумал , что приведенный ниже код будет работать:
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()
метода, который ничего не делает), есть лучший способчтобы гарантировать, что статический конструктор базового типа будет вызываться до того, как будет использован какой-либо из его производных типов?
Если нет, то ... это фиктивный член!