.ctor é conhecido por todos
.cctor não é familiar e pode ser facilmente mal utilizado
O chamado .cctor é um construtor estático na sintaxe de C#
Forma como
Semelhanças e diferenças entre .cctor e .ctor
1. Você não pode ter identificadores de direitos de acesso públicos, privados, etc., que não podem ser usados, o que é diferente do .ctor
2. Não deve haver valor de retorno, que é o mesmo que .ctor
3. Não pode haver parâmetros, .ctor pode ter múltiplos parâmetros
4. Só pode haver um, no máximo, e deve haver pelo menos um .ctor
5. O programador não pode controlar o tempo da chamada .cctor, de certa forma, o programador pode controlar o tempo da chamada
6. Programadores não podem chamar diretamente .cctor, .ctor Quando o programador usa o novo operador, .ctor será definitivamente chamado
.cctor chamado Timing:
O construtor estático é automaticamente chamado antes que a primeira instância seja criada ou qualquer membro estático seja referenciado. (Esta é a citação original no MSDN)
É claro que .cctor é chamado apenas uma vez no mesmo domínio do programa, em vez de ser chamado toda vez que um objeto é instanciado como .ctor
.cctor uso
Construtores estáticos são usados para inicializar qualquer dado estático ou para realizar operações específicas que só precisam ser realizadas uma vez.
Por exemplo:
Todo o código a seguir está compilado no modo Windows 7, em vez de 2005, e se os resultados forem diferentes, considere mudar para o modo de lançamento e tentar novamente
Compile esse segmento de código e então use ILDISM para visualizá-lo, a tabela de métodos é a seguinte
.ctor(): void // Este é um construtor de instância da classe fornecida automaticamente pelo compilador
Main():void(string[]) //Ponto de entrada do programa
Obviamente, não há .cctor no assembly, e o compilador não fornecerá automaticamente funções .cctor quando uma classe não possui campos estáticos que precisam ser inicializados, o que é diferente do .ctor, que sempre existe de qualquer forma
Modificar o código
Ao compilar esse código, haverá um aviso, mas isso não é importante, o importante é que, ao visualizar a montagem com ILDASTOM, o .cctor esperado, construtor estático, não aparece!
O que aconteceu?
A inferência está errada? CCTOR não é um campo estático usado para inicializar uma classe?
Calma, por favor, dê uma olhada no código
A única diferença entre esse código e o anterior é que ele altera o valor inicial do campo estático i, e o próximo passo é testemunhar o momento mágico
Vamos fazer o DASM e, para nossa surpresa, o tão solicitado .cctor finalmente chegou!
Olhe para o código de implementação do .cctor e você vai ver:
.método privado hidebysig nomeespecial rtspecialname static void .cctor() cil managed
{ Código tamanho 7 (0x7) .maxstack 8 IL_0000: ldc.i4.1 // Instanciar campos estáticos :-) IL_0001: stsfld int32 only_lonely. A::i IL_0006: ret } // fim do método A::.cctor
Por que isso acontece? A possível razão é que o valor padrão do tipo Int32 é 0, e o compilador detecta isso e otimiza para não produzir código .cctor
referência
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx
Por fim, podemos implementar uma função .cctor por conta própria para implementar requisitos funcionais especiais
resumo 1、. CTOR é o método de construção; 2、. cctor é um inicializador de tipos, que é um construtor estático em C#; 3. Quando a classe C é instanciada, ela primeiro atribuirá um valor ao campo atribuído no momento da declaração, depois chamará o construtor da classe base, e então se construirá da mesma forma, até o nível superior System.Object, e então voltará para executar o código no método explícito de construção de C, que é esse processo recursivo.
|