Désactiver l’optimisation du compilateur pour une fonction ou un bloc de code spécifique (C #)

Le compilateur fait un excellent travail d’optimisation pour les versions RELEASE, mais il peut parfois être utile de s’assurer que l’optimisation est désactivée pour une fonction locale (mais pas le projet entier en décochant Project Options > Optimize code ).

En C ++, ceci est réalisé en utilisant ce qui suit (avec le #pragma normalement commenté):

 #pragma optimize( "", off ) // Some code such as a function (but not the whole project) #pragma optimize( "", on ) 

Existe-t-il un équivalent en C #?

METTRE À JOUR

Plusieurs excellentes réponses suggèrent de décorer la méthode avec MethodImplOptions.NoOptimization . Cela a été implémenté dans .NET 3.5, mais pas dans la version Compact Framework (CF). Une question connexe est de savoir si un équivalent pour:

 * projects targeting .NET 3.0 or earlier? * projects deployed to a device such as Windows CE 6.0 using the .NET 3.5 CF? 

Vous pouvez décorer une méthode spécifique (ou un getter / setter de propriété) avec [MethodImpl(MethodImplOptions.NoOptimization)] et [MethodImpl(MethodImplOptions.NoInlining)] , ce qui empêchera le JITter d’optimiser et d’aligner la méthode:

 [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] private void MethodWhichShouldNotBeOptimized() { } 

Cependant, il n’y a pas moyen d’appliquer cet atsortingbut à un bloc de code. NoOptimization atsortingbut NoOptimization également été ajouté dans .NET 3.5, ce qui peut être important pour le code hérité ou Compact Framework.

Il existe une liste de directives de préprocesseur C # . Il n’y a pas d’équivalent exact, cependant, il est possible de faire cela en utilisant MethodImplAtsortingbute et en lui passant NoOptimization MethodImplOptions comme ceci:

 using System.Runtime.ComstackrServices; class MyClass { [MethodImplAtsortingbute(MethodImplOptions.NoOptimization)] public void NonOptimizeMethod() { // Do some stuff } } 

En c #, il n’y a pas d’équivalent à la directive #pragma. Tout ce que vous pouvez faire est de désactiver la méthode. MethodImpl est dans System.Runtime.ComstackrServices.

 [MethodImpl(MethodImplOptions.NoOptimization)] void TargetMethod ()