Qual é a melhor maneira de garantir que o construtor estático de uma classe base seja chamado?
odocumentação sobre construtores estáticos em C # diz:
Um construtor estático é usado para inicializar qualquer dado estático ou para executar uma ação específica que precisa ser executada apenas uma vez. É chamado automaticamenteantes da criação da primeira instância ou de referência a qualquer membro estático.
Essa última parte (aproximadamente quando é chamada automaticamente) me jogou para um loop; até ler essa parte Ipensamento simplesmente acessando uma classede qualquer maneira, Eu poderia ter certeza de que o construtor estático de sua classe base havia sido chamado. Testar e examinar a documentação revelaram que esse não é o caso; parece que o construtor estático para umbase não é garantido que a classe seja executada até que um membrodessa classe base especificamente é acessado.
Agora, acho que na maioria dos casos, quando você está lidando com uma classe derivada, você constrói uma instância e isso constitui uma instância da classe base que está sendo criada, assim o construtor estático seria chamado. Mas se eu estou lidando apenas comestático membros dederivado aula, o que então?
Para tornar isso um pouco mais concreto, eupensamento que o código abaixo funcionaria:
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);
}
Eu assumi que acessar oType<T>
A classe chamaria automaticamente o construtor estático paraTypeBase
; mas isso parece não ser o caso.Type<int>.Name
énull
, e o código acima gera a sequência vazia.
Além de criar algum membro fictício (como um estáticoInitialize()
método que não faz nada),existe uma maneira melhor de garantir que o construtor estático de um tipo base seja chamado antes que qualquer um de seus tipos derivados seja usado?
Se não, então ... membro fictício é!