Stałe w C #

9

Dlaczego kompilator przechowuje stałe wartości w metadanych zestawu? Czy są bezpośrednio osadzone w kodzie języka pośredniego z metadanych zestawu?

Bieg
źródło
1
to tak naprawdę nie odnosi się do „dlaczego”, ale jest interesujące: stackoverflow.com/a/2128633/128384
stijn
Jestem zaskoczony tym pytaniem. Gdzie jeszcze byłyby przechowywane, gdyby nie metadane? Czy możesz wyjaśnić pytanie?
Eric Lippert,

Odpowiedzi:

4

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.

Jimmy Hoffa
źródło
2

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.

Bieg
źródło
1

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.

adrianm
źródło
2
Jednak to tak naprawdę nie wyjaśnia, dlaczego stałe są przechowywane w metadanych. Tańczy wokół tego, ale nie sądzę, że OP w ogóle myli dwa zespoły. Widzisz to jako problem z dwoma zespołami, ponieważ używasz dwóch zespołów, ale nie sądzę, że praktyka jest powszechna; stałe są zazwyczaj definiowane w tym samym zestawie, w którym są używane.
Robert Harvey
@RobertHarvey Twoje domniemanie typowego przypadku przecenia umiejętności wielu naszych przedsiębiorczych współpracowników C #, wiele razy musiałem wyjaśniać, czym jest const dla kolegów i dlaczego nie wywołujesz ich w różnych zgromadzeniach.
Jimmy Hoffa
1

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.

Strajkowicz
źródło
1
Dziesiętny nie jest typem pierwotnym, ale można tworzyć stałe dziesiętne. I możesz tworzyć stałe dowolnego typu odniesienia, pod warunkiem, że stała ma wartość null.
Eric Lippert,