2012-10-23 8 views
6

Jeśli mam dwie klasy, A i B gdzie B pochodzi od:Informacje o lanego C# typów referencyjnych w pamięci

class A {} 
class B : A { } 

mogę uskok dość szczęśliwie wystąpienie B do A.

B b = new B(); 
A a = b; 

Teraz mogę zrozumieć, w jaki sposób środowisko wykonawcze może określić, że typ bazowy jest B, jako stronie 132 ECMA-335 (Common Language Infrastructure (CLI) Przegrody I do VI) stwierdza

Objects typów inicjowanych musi zawierać wystarczającą ilość informacji, aby uzyskać w danym czasie rzeczywistym dokładny typ (z uwzględnieniem typów i liczby ich ogólnych argumentów). [Uzasadnienie: Jest to konieczne, aby prawidłowo wdrożyć odlewanie i instancję-testów, a także w refleksji możliwości

więc, w jaki sposób środowisko wykonawcze wiedzieć, że chociaż typ bazowy jest B w rzeczywistości jest przechowywany w A. Wiem na pewno, że nie zobaczę dostępnych metod na B, ale jeśli podstawowym typem jest B, w jaki sposób zapisuje on typ lokalizacji przechowywania A?

Czy to ma sens?

Odpowiedz

7

Obiekt jest B, a CLI wie, że jest to B. Rzecz, która wie o A jest głównie kompilator, który następnie deklaruje pole lub lokalny jako typu A (lub w niektóre przypadki, takie jak metoda łańcuchowa, typ jest znany za pośrednictwem metody zwracania metody, która jest ostemplowana w telefonie dzwoniącego pod numerem). Więc w zasadzie: kod wywołujący sam w sobie mówi "Myślę, że to jest A". Zadania itd. Są zazwyczaj weryfikowalne z góry, więc nie ma ryzyka, że ​​się pomyli. Jeśli spróbujesz zhakować IL, aby celowo go zepsuć, środowisko wykonawcze poinformuje cię i odmówi uruchomienia tej metody. Z tych powodów przypisanie wartości znanej do B do lokalnej/pola A nie wymaga żadnego sprawdzania typu - jest to tylko bezpośrednie przypisanie.

+0

Pozdrowienia Marc, to wyjaśniono. –

3

Faktyczny typ obiektu jest zawsze przechowywany z samym obiektem na stercie. Odwołanie wskazujące na ten obiekt może być innego typu, o ile ten typ jest przypisywany z rzeczywistego typu (np. Klasa bazowa lub zaimplementowany interfejs tego typu).

Każdy obiekt na stercie ma niewielką ilość danych przechowywanych razem z nim - typ tego obiektu jest jedną z tych rzeczy.

Powiązane problemy