2013-10-23 10 views
6

ECMA-335, 1.8.2.4, określa, że ​​typy pudełkowe obejmują typy referencyjne (z wyjątkiem wskaźników zarządzanych/byrefs) i parametry ogólne.Dlaczego typy referencji boksu?

Jaki jest cel boksowania typów referencyjnych? Czy funkcjonalność i reprezentacja pamięci pudełkowego obiektu referencyjnego jest inna niż w przypadku niezakrytej?

+2

. NET pozwala na oznaczenie typu odniesienia, ale C# nie. Pozwala na to środowisko wykonawcze, ale ta funkcjonalność nigdy nie zostanie wykorzystana przez kompilator C#. – Servy

+0

@Servy, jak to działa w praktyce, choć hipotetyczny zdaję sobie z tego sprawę. Czy byłoby to jak 'var o = (object) myRefInstance;'? To dziwne, ponieważ 'myRefInstance' wyraźnie już bazuje na' obiekcie'. –

+2

Ponadto, "Jeśli typeTok jest typem odniesienia, instrukcja box zwraca wartość niezmienioną jako obj" - III.4.1. –

Odpowiedz

5

Nie ma nic logicznie złego w boksowaniu referencji typu odniesienia. To po prostu no-op, nic się nie zmienia.

Ale Ecma-335 nie zawsze jest dobrym opisem tego, co jest naprawdę zaimplementowane w .NET CLR. Funkcja pomocnicza JIT_Box(), która implementuje Opcodes.Box, faktycznie rzuci wyjątek InvalidCastException, gdy zostanie poproszony o podanie wartości, która nie jest typem wartości. Oczekuje, że kompilator i jitter dowiedzą się, kiedy przerwać konwersję boksu, gdy jest to niepotrzebne. Oni robią.

+0

Ale akceptuje ogólny parametr, który reprezentuje typ odniesienia bez zgłaszania wyjątku. W takim przypadku zachowanie no-op jest wymagane do obsługi rzutowania z 'T' na' object'. – CodesInChaos

+0

To jest ważny punkt. Dżungla jest już świadoma, że ​​T jest typem odniesienia i całkowicie pomija kod do konwersji boksu. –

+0

Czy sprawdziłeś, czy faktycznie rzuca podczas używania 'box' na normalnym typie referencyjnym? Być może JITter optymalizuje go w tym przypadku, zanim dotrze do kodu rzutu wyjątku. – CodesInChaos

3

Rozważmy funkcję Generic:

object MyBox<T>(T value) 
{ 
    return (object)value; 
} 

To kompiluje do:

ldarg.1  
box   01 00 00 1B 
ret 

Oczekiwane zachowanie tej funkcji jest no-op czy T to rodzaj odniesienia, boks wartość do siebie .

Boks wartość, która jest znana jako typ odniesienia, jest mniej przydatna, ale jej podanie w sposób zgodny z ogólnymi jest proste i spójne.

Powiązane problemy