Inline to szczegół implementacji JIT, a nie kompilatora C#. Od Eric Gunnerson's blog:
JIT wykorzystuje szereg heurystyk do zdecydować, czy dana metoda powinna być w wysadzanej. Poniższa lista WaŜniejszymi tych ( zauważyć, że nie jest wyczerpujący)
- metod, które są większe niż 32 bajty IL nie być wstawiane.
- Funkcje wirtualne nie są podkreślone.
- Metody, które mają złożoną kontrolę przepływu, nie zostaną uwzględnione. Złożona kontrola przepływu to dowolna kontrola przepływu inna niż niż w przypadku/then/else; w tym przypadku przełącznik lub podczas.
- Metody, które zawierają bloki obsługi wyjątków, nie są narysowane, ale metody, które wyrzucają wyjątki od , nadal są kandydatami do wstawiania .
- Jeśli którykolwiek z formalnych argumentów metody jest sformatowany, metoda nie zostanie wstawiona w postaci .
Chociaż metoda jest dość krótki i niezbyt skomplikowane więc może dopasować heurystyki, Nullable<T>
jest struct
więc Przypuszczam metoda nie jest inlined.
Zgodnie z ogólną zasadą, jeśli oznaczenie tej metody poprawi wydajność, JIT wprowadzi tę metodę; inaczej nie będzie. Ale to jest naprawdę szczegółowo wdrożenie JIT i nic nie trzeba kodować:
bym starannie rozważyć wyraźnie kodowania dla tych heurystyk, ponieważ mogą one ulec zmianie w przyszłych wersjach JIT. Nie podważaj poprawności metody, aby spróbować zagwarantować, że zostanie ona wstawiona.
EDIT: Widocznie nieco o elemencie nie jest włączonych jest out-of-date; zaktualizowane informacje można znaleźć pod adresem Vance Morrison's blog.
Trudno powiedzieć "tak", ale ponieważ jest to prywatne, zakładam, że tak. –
Kompilator języka C# nigdy nie wstawia * nic *. Aby uzyskać listę optymalizacji kompilator C# - a nie kompilator jit - wykonuje, zobacz mój artykuł na ten temat. http://blogs.msdn.com/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx –
Dzięki Eric, wygląda na to, że mam dużo do zrobienia. – ChaosPandion