Dlaczego kompilator przechowuje stałe wartości w metadanych zestawu? Czy są bezpośrednio osadzone w kodzie języka pośredniego z metadanych zestawu?
c#
clr
compilation
Bieg
źródło
źródło
Odpowiedzi:
Najlepszy sposób, aby o tym pomyśleć, to: W czasie kompilacji const jest konwertowany na literał, w którym jest używany.
Jedynym powodem, dla którego wchodzi w manifest w zestawie, w którym został zdefiniowany, było udostępnienie go konsumentom. Jest to część danego typu, a metadane tego typu są przechowywane w jego zestawie, a nie w zestawach, które go zużywają.
Jest to więc dosłowne zużycie w linii oraz właściwość lub pole w postaci materiałów eksploatacyjnych w metadanych.
źródło
Długo szukałem siebie i na podstawie książki stwierdziłem, że może to być powód ...
Ponieważ stałe wartości nigdy się nie zmieniają, stałe są uważane za część typu definiującego. Dlatego zdefiniowanie stałych tworzy metadane.
źródło
Myślę, że mieszasz dwa zespoły.
Stała jest przechowywana tylko w metadanych w zespole, w którym jest zdefiniowana . Metadane zawierają informacje o wszystkich typach i elementach w zespole, a stałe są elementami.
Żadne informacje o stałej nie są przechowywane w zestawie, w którym są używane . Stała wartość jest używana bezpośrednio w IL tak, jakbyś zapisał stałą liczbę lub ciąg znaków bezpośrednio w źródle.
Przykład: jedna z moich aplikacji używa wielu stałych do identyfikowania tabel i pól bazy danych. Mam jeden zestaw, który zawiera tylko wszystkie stałe.
Kiedy buduję aplikację, dodaję odwołanie do zestawu „stałych” w Visual Studio. Ponieważ zestaw zawiera tylko stałe, nie ma odniesienia do niego w mojej aplikacji, a zestaw „stałych” nie jest potrzebny w czasie wykonywania.
źródło
Stałe są znane w czasie kompilacji, a następnie są przechowywane w metadanych zestawu. Oznacza to, że można definiować tylko stałe dla typów pierwotnych.
Tak, są one ładowane bezpośrednio z metadanych. W czasie wykonywania nie będzie alokacji pamięci.
źródło