Por que o compilador armazena valores constantes nos metadados do assembly? Eles são incorporados diretamente ao código do Idioma Intermediário a partir dos metadados do assembly?
Por que o compilador armazena valores constantes nos metadados do assembly? Eles são incorporados diretamente ao código do Idioma Intermediário a partir dos metadados do assembly?
Respostas:
A melhor maneira de pensar sobre isso é: No momento da compilação, uma const é convertida em um literal onde é usada.
O único motivo pelo qual ele entra no manifesto na montagem em que foi definido foi torná-lo acessível aos consumidores. É parte de um determinado tipo e os metadados desse tipo são armazenados em sua montagem, não nas montagens que os consomem.
Portanto, é um literal in-line em consumo e uma propriedade ou campo consumível encapsulado por tipo em metadados.
Pesquisei-me por um longo tempo e descobri em um livro que esse pode ser o motivo ...
Como os valores constantes nunca mudam, as constantes são consideradas parte do tipo de definição. Portanto, definir constantes cria metadados.
Eu acho que você mistura duas assembléias.
A constante é armazenada apenas nos metadados na montagem em que está definida . Os metadados contêm informações sobre todos os tipos e membros em uma montagem e constantes são membros.
Nenhuma informação sobre a constante é armazenada na montagem em que é usada . O valor constante é usado diretamente na IL, como se você tivesse escrito o número ou a sequência constante diretamente na fonte.
Um exemplo: um dos meus aplicativos usa muitas constantes para identificar tabelas e campos do banco de dados. Eu tenho um assembly que contém apenas todas as constantes.
Quando crio o aplicativo, adiciono uma referência ao assembly "constantes" no Visual Studio. Como o assembly contém apenas constantes, não há referência a ele no meu aplicativo e o assembly "constantes" não é necessário no tempo de execução.
As constantes são conhecidas no momento da compilação e, em seguida, são armazenadas nos metadados do assembly. Isso significa que você só pode definir constantes para tipos primitivos.
Sim, eles são carregados diretamente dos metadados. Não haveria alocação de memória no tempo de execução.