Quando eu tenho uma classe contendo um construtor estático, esse construtor é chamado quando o assembly que contém a classe é carregado pela primeira vez ou quando a primeira referência a essa classe é atingida?
Respostas:
Quando a aula é acessada pela primeira vez.
Construtores estáticos (guia de programação C #)
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. Ele é chamado automaticamente antes que a primeira instância seja criada ou qualquer membro estático seja referenciado.
A static constructor is used to initialize any static data
NÃO. Melhor usar static initializer
para inicializar coisas estáticas.
Não é tão simples quanto você pode esperar, apesar da documentação direta. O artigo de Jon Skeet http://csharpindepth.com/Articles/General/Beforefieldinit.aspx aborda essa questão em detalhes.
Resumo:
O construtor estático tem a garantia de ser executado imediatamente antes da primeira referência a um membro dessa classe - seja na criação de uma instância ou no próprio método / propriedade estática da classe.
Observe que os inicializadores estáticos (se não houver um construtor estático) garantem a execução a qualquer momento antes da primeira referência a um campo específico.
O construtor estático é chamado antes de você usar qualquer coisa na classe, mas exatamente quando isso acontece é com a implementação.
É garantido que será chamado antes que o primeiro membro estático seja acessado e antes que a primeira instância seja criada. Se a classe nunca for usada, o construtor estático não terá garantia de ser chamado.
No caso do método estático ser chamado da classe pai, o construtor estático não será chamado, embora seja explicitamente especificado. Aqui está um exemplo que o construtor b não será chamado se b.methoda () for chamado.
static void Main(string[] args)
{
b.methoda();
}
class a
{
public static void methoda()
{
//using initialized method data
}
}
class b : a
{
static b()
{
//some initialization
}
}
Parece haver uma pegadinha com construtores estáticos que é respondida em outro lugar, mas demorou um pouco para ser digerida em uma explicação simples. Todos os documentos e explicações afirmam que o construtor / inicializadores estáticos têm "garantia" de execução antes que a primeira classe seja instanciada ou o primeiro campo estático seja referenciado. A pegadinha surge quando você tenta colocar um singleton estático na classe que cria uma instância de si mesmo (galinha / ovo). Nesse caso, o construtor estático acaba sendo chamado após o construtor da instância - e no meu caso o construtor da instância continha código que dependia de alguns dados estáticos.
Construtor estático chamado após o construtor de instância?
(a resposta para mim foi colocar o singleton em uma classe separada ou inicializar manualmente os dados estáticos no construtor de instância antes que seja necessário)