Anonyme Methoden funktionieren genauso wie normale Methoden - wenn der JIT-Compiler sie inline einfügt, können sie inline werden.
Am wahrscheinlichsten rufen Sie jedoch keine anonyme Methode direkt auf - Sie rufen einen Delegaten auf, der auf die anonyme Methode verweist. In diesem Fall kann der Compiler, wie bei jedem anderen Aufruf von Delegaten, nichts inline einfügen, da er zur Kompilierungszeit (oder JIT-Zeit) nicht weiß, welche Methode tatsächlich aufgerufen wird.
Ich denke, Sie sind verwirrt mit wie Generika in .NET arbeiten, anstatt anonymen Methoden explizit, insbesondere mit C++ 's-Vorlagen kontrastierten - zum Beispiel, wenn ich collection.Select(i => i.SomeProperty)
in C# zu tun, gibt es nach wie vor nur eine Methode Select
[1]; Wie würden Sie die i => i.SomeProperty
Methode inline, wenn es andere Select
Aufrufe gibt, die verschiedene Funktionen als Argumente annehmen? Im Gegensatz dazu erlaubt das Verwenden von Vorlagen in C++ das Einfügen von "Funktions" -Argumenten, da die Vorlagen nur eine Kompilierzeit-Codegenerierungsfunktion sind; Jede Verwendung eines analogen Select
-Templates in C++ würde Ihnen einen separaten Codeabschnitt geben, an dem kein Methodenaufruf beteiligt ist.
Es ist unnötig zu sagen, dass dies nur ein Implementierungsdetail ist. Für einen zukünftigen Compiler wäre es sinnvoll, den Methodenaufruf zu verknüpfen, indem er vorgibt, kein Delegat zu sein, und die Methode Select
selbst inline einfügt.
[1] - Technisch gesehen gibt es während der JIT-Kompilierung möglicherweise mehrere Versionen der Select
-Methode für verschiedene Typargumente - dies hat jedoch keine Auswirkungen auf dieses Szenario; es macht immer noch keine andere Methode für jedes mögliche Argument.
Eine beliebige Anzahl von kostenlosen .NET Decompilern kann Ihnen die Antwort darauf zeigen. –