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

Disable compiler optimisation for a specific function or block of code (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# 中是否有等效项?

更新

几个很好的答案建议用 MethodImplOptions.NoOptimization 修饰方法。这是在 .NET 3.5 中实现的,但不是在 Compact Framework (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# 中没有等效于 #pragma 指令。您所能做的就是禁用方法范围。 MethodImpl 在 System.Runtime.CompilerServices 中。

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

有一个这样的 C# Preprocessor Directives. There is no exact equivalent, however it is possible to do this using the MethodImplAttribute and passing it the NoOptimization MethodImplOptions 列表:

using System.Runtime.CompilerServices;

class MyClass
{
    [MethodImplAttribute(MethodImplOptions.NoOptimization)] 
    public void NonOptimizeMethod()
    {
        // Do some stuff
    }
}