Zastanawiam się, co robi C#, gdy na przykład obsadzono object
na int
.Jak działa casting?
object o = 10;
int i = (int) o;
Bardzo doceniane :)!
Zastanawiam się, co robi C#, gdy na przykład obsadzono object
na int
.Jak działa casting?
object o = 10;
int i = (int) o;
Bardzo doceniane :)!
W ogólnym przypadku, że jest trudny; p To zależy od dokładnego scenariusza:
object
, jest unbox operacja, która odwraca szczególny sposób, w którym wartości typy mogą być przechowywane w odniesieniu do obiektu (Unbox
/Unbox_Any
)Nullable<int>
, a następnie Właściwość .Value
jest obliczana (co może spowodować wyjątek, jeśli wartość jest pusta)uint
, float
, itp.), to określony kod operacji (który może być niczym) jest emitowany do przeprowadzenia konwersji bezpośrednio w IL (Conv_I4
)Call
)CastClass
)myślę że jest dość kompletny?
To jest przykład boksu i unboxing:
http://msdn.microsoft.com/en-us/library/yz2be5wk(VS.80).aspx
C# bierze typ wartości int (być może jest to zmienna lokalna, w rejestrze lub na stosie), boks go w obiekt i umieszczenie go na stercie. Po odesłaniu do int proces jest odwrotny.
Generalnie rzecz biorąc, kompilator tworzy dość złożone i specyficzne dla typu IL podczas rzutowania, w szczególności musi upewnić się w czasie wykonywania, że typy, które rzutujesz są kompatybilne, szukać określonych operatorów rzutowania zdefiniowanych w kodzie, radzić sobie z przepełnienia itp. Odlewanie to dość kosztowny proces.
Czy ten sam proces występuje, gdy jest to niejawna konwersja? A więc: 'object o = myClass' – Kevin
Nie - jeśli myClass nie jest typem wartości, wówczas nie ma tu rzeczywistego kodu konwersji ani boxingu. Rzucanie łańcucha dziedziczenia w ten sposób jest trywialnym przypadkiem, więc można oczekiwać bardzo szybkiego i prostego wyniku IL. Obiekt, do którego odwołuje się o, jest wciąż tego samego typu, do którego odwołuje się myClass. –
Rzuć tutaj aby uzyskać informacje na temat: Casting
Ponadto, warto się zapoznać: Boxing and Unboxing
W tym konkretnym przypadku, to się nazywa "unboxing", sprawdź http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx
Świetna odpowiedź, dzięki :). – Kevin