2009-08-31 7 views
5

.NET Mamy prymitywne typy danych, takie jak int i typy wartości, takie jak struct.W jaki sposób .NET rozróżnia typy odniesienia względem typów pierwotnych i wartościowych:

A także mamy typy referencyjne. Wszystkie wydają się pochodzić z klasy obiektowej.

W jaki sposób .NET określa prymitywę, typ wartości na typ odniesienia?

Gdzie to jest zrobione? W kompilatorze lub w JIT?

Czy należy to do możliwości kompilatorów?

+0

Przykro mi, ale nie do końca rozumiem twoje pytanie. –

Odpowiedz

11

Wszystkie typy wartości, w tym prymitywy Common Type System (CTS), pochodzą BEZPOŚREDNIO od typu CTS "System.ValueType", (z wyjątkiem wyliczeń).

Kompilator może więc stwierdzić, badając typ bazowy dowolnego typu. Jeśli jest to "System.ValueType", to jest to typ wartości, w przeciwnym razie jest to typ odniesienia.

EDIT: wyliczenia, jak w

public Enum Shipper {FedEx, Aerborne, USPS, Stork} 

... nie wynikają bezpośrednio z System.ValueType, czerpią z System.Enum, która wywodzi się z System.ValueType ...

+0

Z wyjątkiem 'System.Enum', który pochodzi od' System.ValueType', ale nie jest typem wartości. Ale wszystkie typy 'enum' są * typami wartości wywodzącymi się z' System.Enum', co czyni ich typ bazowy nie 'System.ValueType'. Tak więc typy wartości są typami pochodzącymi od 'System.ValueType' z wyjątkiem' System.Enum', chociaż wewnętrzna implementacja tego testu może być wykonana wydajniej niż to. –

+0

Dzięki Charles. Czy java działa w podobny sposób? –

+0

@ 280Z28: Nie jestem pewien, co to oznacza, ponieważ System.Enum nie jest typem, którego możesz użyć bezpośrednio. W rzeczywistości nie jest nawet wystarczająco realistyczny, aby użyć jako ograniczenia dla typu ogólnego (patrz u dołu strony http://msdn.microsoft.com/en-us/library/d5x73970.aspx). –

2

Typy wartości są faktycznie wyprowadzane z System.ValueType, który sam pochodzi z System.Object.

2

Wartość typy pochodzą z System.ValueType, co między innymi daje domyślną (ale wolną) implementację GetHashCode i Equals. (Są powolne, ponieważ używają refleksji).

Rodzaje prymitywów, takie jak int mogą być zapakowane w typy wartości w IL za pomocą instrukcji box. Mają specjalne instrukcje IL do pracy z nimi.

Typy referencyjne to wszystkie pozostałe klasy.

Istnieją również wskaźniki, które mogą być używane w kodzie unsafe i nie pochodzą w ogóle z object. EDYCJA - proof.

+0

Czy jesteś pewien, że typy wskaźników nie pochodzą od IntPtr? –

+0

Tak, są całkowicie niepowiązani. Po pierwsze, 'IntPtr' jest strukturą, a nie możesz czerpać z struct. – SLaks

Powiązane problemy