Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 31028|Resposta: 1

[Fonte] .ctor e .cctor do .NET

[Copiar link]
Publicado em 06/04/2017 14:56:38 | | | |
.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.





Anterior:Objetos genéricos vinculados ao contexto: ContextBoundObject e classes genéricas não são suportadas
Próximo:Resumo da ordem de execução de métodos estáticos, não estáticos e construtivos em uma classe
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com