Jeśli pojawi się pod maską, typy wartości w języku C# są traktowane bardzo dokładnie przez kompilator/CLR. Ale typy wewnętrzne dla CLR są traktowane jeszcze bardziej. Oto co mam na myśli:Czy jest możliwe utworzenie System.Int32 w języku C#?
int a = 5;
int b = 10;
int с = a + b;
a.CompareTo(b);
Można najechaniu myszką nad int
w Visual Studio i zobaczyć, że faktycznie jest to System.Int32
struct. W porządku. Teraz możesz chwycić ILDasm i sprawdzić, co to jest System.Int32
: przewraca, że jest to bardzo prosta struktura z jednym polem typu int32
(jest to int32
wewnętrzny dla CLR) i nie ma przeciążonego operatora dla dodania.
Więc, jak działa int с = a + b
? Ponownie chwytam ILDasm i patrzę na IL. Okazuje się, że w kodzie IL nie ma kodu System.Int32
: kompilator automatycznie rozumie, że powinien go zastąpić numerem int32
. I jest instrukcja IL add
, która działa dla pary int32
na stosie. Co mnie bawi, CLR pozwala wywoływać metody instancji dla System.Int32
na int32
. Wygląda mi na czarną magię.
Oto proste pytania teoretyczne: wydaje się, że System.Int32
jest typem podobnym do jakiegokolwiek innego, czy można go w jakiś sposób utworzyć w języku C#? A jeśli to możliwe, czy możesz zrobić z nim coś użytecznego (rzeczywiste pole int32
jest prywatne)?
Edit: Ok, aby uczynić go nieco bardziej jasne: to pytanie nie ma nic o int
jest alias do System.Int32
. Można wziąć podany przykład, zamienić int
na System.Int32
i pominąć pierwszy akapit za przykładem. Prawdziwe pytanie dotyczy możliwości posiadania valuetype [mscorlib]System.Int32 a
w swoim kodzie IL zamiast tylko int32 a
.
'int a = new int();' jest tym samym, co 'System.Int32 a = new System.Int32();'. To tylko cukier syntaktyczny. Obie będą reprezentowane wewnętrznie jako 'int32'. Mimo że w CLR występuje garść struktur, które są obsługiwane "magicznie", jest to lepsze niż w niektórych innych językach, takich jak Java, gdzie pobieranie wszystkich dodatków wymaga boksowania/rozpakowywania. –