Constantes em c #

9

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?

Uma corrida
fonte
11
isso realmente não aborda o 'porquê', mas é interessante, no entanto: stackoverflow.com/a/2128633/128384
stijn
Estou confuso com esta pergunta. Onde mais eles seriam armazenados se não estivessem em metadados? Você pode esclarecer a pergunta?
precisa

Respostas:

4

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.

Jimmy Hoffa
fonte
2

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.

Uma corrida
fonte
1

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.

adrianm
fonte
2
Isso realmente não explica por que as constantes são armazenadas nos metadados. Dança em torno do porquê, mas não acho que o OP esteja confundindo duas assembléias. Você vê isso como um problema de duas assembléias porque usa duas assembléias, mas não acho que essa prática seja comum; constantes geralmente são definidas no mesmo assembly em que são usadas.
Robert Harvey
@RobertHarvey Sua presunção do caso típico superestima a habilidade de muitos de nossos colegas de negócios C #, muitas vezes tive que explicar o que é uma const para os colegas e por que você não os chama em assemblies.
Jimmy Hoffa
1

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.

atacante
fonte
11
Decimal não é um tipo primitivo, mas você pode criar constantes decimais. E você pode criar constantes de qualquer tipo de referência, desde que a constante seja nula.
precisa saber é o seguinte