.NET IL è così semplice rispetto ai veri e propri linguaggi di assemblaggio della CPU (x86, ecc.) Che c'è solo un modo per fare praticamente tutto. Ciò significa che non è possibile ottenere prestazioni migliori con un IL migliore, perché non esiste un IL migliore. (Supponiamo che tu non generi IL in modo non ottimale intenzionalmente, cosa che fa un build di debug.)
Le prestazioni .NET dipendono molto di più dal JIT-ter. Comunque, l'intera idea di un linguaggio di alto livello, JIT-ting, GC-ing, ecc. ha i suoi pedaggi sulle prestazioni, quindi le leggere ottimizzazioni in IL non contano molto.
Quindi perché le persone usano IL? È quando generi codice (come quando compili un XSLT, un'espressione regolare o un proxy dinamico). È molto più veloce da fare in IL che creare un codice C# in un buffer di stringa e compilarlo, e questo è tutto.
Oltre alla possibilità di generare codice al volo, quando IL è un must, non credo che IL abbia altri vantaggi. C# è una lingua così ricca e in rapida evoluzione, sarebbe semplicemente pazzesco non usarla. Dover lavorare in IL sarebbe una punizione. Puoi essere certo che C# può essere compilato come IL il più buono possibile.
Puoi anche sentirti libero di utilizzare tutti i tipi di funzionalità C# più recenti. Sono d'accordo, cose come la dinamica potrebbero non avere le migliori prestazioni, ma non si tratta di prestazioni, ma di funzionalità moderne che ti aiutano solo a fare le cose. IL non ti dà questo. (Naturalmente alcune nuove funzionalità aiutano realmente le prestazioni, come asincrone, ma in modi molto diversi rispetto alle ottimizzazioni a livello di assembly, ad un livello molto più elevato.)
E a proposito, AFAIK non è possibile incorporare IL in un C# file. Oltre a generare un nuovo codice al volo, non è possibile compilare IL nel proprio assieme, almeno non in Visual Studio, tranne che con alcuni trucchi che implicano la modifica degli assembly dopo che sono stati creati da C#.
Quando il gioco è veramente, * veramente * cattivo. Spero che tu non ci arrivi mai. – BradleyDotNET
sì, immagino. Mi piacerebbe solo vedere i parametri che portano alla decisione. – dbarnes
Dapper usa IL perché ha bisogno di generare dinamicamente codice per tipi che non conoscerà fino al runtime. Non dovresti usare IL per altre circostanze. –