禁用特定函数或代码块的编译器优化(C#)

编译器在优化RELEASE构建方面做得很好,但有时候确保为本地函数关闭优化(但不是通过取消Project Options > Optimize code来关闭整个项目)。

在C ++中,这可以通过以下方式实现( #pragma通常已注释掉):

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

C#中有等价的吗?

UPDATE

几个优秀的答案建议使用MethodImplOptions.NoOptimization装饰方法。 这是在.NET 3.5中实现的,但不是在Compact Framework(CF)版本中。 一个相关的后续问题是,是否相当于:

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

您可以使用[MethodImpl(MethodImplOptions.NoOptimization)][MethodImpl(MethodImplOptions.NoInlining)]修饰特定方法(或属性getter / setter),这将阻止JITter优化和内联方法:

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

但是,没有办法将此属性应用于代码块。 此外,在.NET 3.5中添加了NoOptimization属性,这对于遗留代码或Compact Framework可能很重要。

有一个C#预处理器指令列表。 没有确切的等价物,但是可以使用MethodImplAttribute执行此操作并向其传递NoOptimization MethodImplOptions,如下所示:

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

在c#中,没有与#pragma指令等价的东西。 您所能做的就是方法范围禁用。 MethodImpl位于System.Runtime.CompilerServices中。

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