2010-11-12 14 views
6

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 :)!

Odpowiedz

10

W ogólnym przypadku, że jest trudny; p To zależy od dokładnego scenariusza:

  • (gdy cel jest typem wartości), jeśli sourc wartość E, jest znany jako 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)
  • jeśli typ źródła jest Nullable<int>, a następnie Właściwość .Value jest obliczana (co może spowodować wyjątek, jeśli wartość jest pusta)
  • , jeśli typ źródła jest jednym z kilku wbudowanych typów udokumentowanych w specyfikacji (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)
  • , jeśli typ źródłowej niestandardowy bezpośrednia lub pośrednia operatora konwersji wyznaczonej (dopasowanie typu docelowego), wówczas operator wywołany jako metody statycznej (Call)
  • (w przypadku typów odniesienia), jeżeli jest isn” t oczywiście zawsze nieprawdziwe (różne hierarchie), a następnie odlew odniesienia/kontrola jest wykonywana (CastClass)
  • inaczej kompilator traktuje to jako błąd

myślę że jest dość kompletny?

+0

Świetna odpowiedź, dzięki :). – Kevin

4

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.

+0

Czy ten sam proces występuje, gdy jest to niejawna konwersja? A więc: 'object o = myClass' – Kevin

+0

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. –