Jest to bardziej „Ciekawe dlaczego” niż konkretnego problemu, ale spojrzeć na poniższy kodDlaczego niejawnie wywołanie toString na typ wartości powodują dyspozycję skrzynki
static void Main(string[] args)
{
int val = 10;
Console.WriteLine("val is {0}", val); // (1)
Console.WriteLine("val is {0}", val.ToString()); //(2)
}
W przypadku (1) dodaje się IL jest wyjście
IL_0000: nop
IL_0001: ldc.i4.s 10
IL_0003: stloc.0
IL_0004: ldstr "val is {0}"
IL_0009: ldloc.0
IL_000a: box [mscorlib]System.Int32
IL_000f: call void [mscorlib]System.Console::WriteLine(string,
object)
w przypadku (2), gdzie jawnie wywołać metodę toString uzyskać
IL_0014: nop
IL_0015: ldstr "val is {0}"
IL_001a: ldloca.s val
IL_001c: call instance string [mscorlib]System.Int32::ToString()
IL_0021: call void [mscorlib]System.Console::WriteLine(string,
object)
Więc w przypadku (1), choć int nadpisuje toString, typ wartość jest zapakowane i metoda toString nazywa który przypuszczalnie wywołuje vtable nadpisanie
więc wynik jest dokładnie taki sam, ale wyraźne toString unika operacji Boks
Ktoś wie dlaczego?
= Edit =
OK, aby być jasne, co mnie mylące jest to, że zaczynam z założenia, że mimo int pochodzi z System.ValueType, które z kolei wywodzi się z System.Object ponieważ zawiera toString, GetHashCode itd.
Tak więc w moim naiwnym widoku (prawdopodobnie z C++), jeśli przesłonię metodę wywodzącą się z System.Object, wtedy nie ma potrzeby rzutowania do System.Object (a stąd pole typu wartości), ponieważ istnieje metoda overriden i kompilator automatycznie odwoła się do pozycji vtable dla typu.
Zakładam również, że wywołanie Console.WriteLine() domyślnie dzwoni do int.toString, więc być może właśnie tam idę źle. Nadzieja, że ma sens
OK - wszystkie posortowane. Dziękuję wszystkim za ustawienie mnie prosto. Wszystko co robiłem ze złym założeniem, że Console.WriteLine wykonywała niejawną konwersję ciągów znaków. Nie pytaj mnie, dlaczego uważam, że - jak wydaje się oślepiająco oczywiste, że źle jest teraz :)
Tak, właśnie tam się mylę. Zakładam, że istnieje niejawna obsada. Ma sens teraz! – zebrabox