Отключить оптимизацию компилятора для определенной функции или блока кода (С#)

Компилятор отлично справляется с оптимизацией для сборки RELEASE, но иногда может быть полезно обеспечить, чтобы оптимизация была отключена для локальной функции (но не весь проект, отключив Project Options > Optimize code).

В С++ это достигается с помощью следующего (с нормально откомментированным #pragma):

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

Есть ли эквивалент в С#?

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?

Ответ 1

Вы можете украсить определенный метод (или свойство getter/setter) с помощью [MethodImpl(MethodImplOptions.NoOptimization)] и [MethodImpl(MethodImplOptions.NoInlining)], это не позволит JITter оптимизировать и вставить метод:

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

Однако не существует способа применить этот атрибут к блоку кода. Также в .NET 3.5 был добавлен атрибут NoOptimization, который может иметь важное значение для устаревшего кода или Compact Framework.

Ответ 2

Существует список Директивы препроцессора С#. Точного эквивалента нет, однако это можно сделать с помощью MethodImplAttribute и передать его NoOptimization MethodImplOptions следующим образом:

using System.Runtime.CompilerServices;

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

Ответ 3

В С# нет эквивалента директиве #pragma. Все, что вы можете сделать, это отключить область метода. MethodImpl находится в System.Runtime.CompilerServices.

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