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

компилятор выполняет большую работу по оптимизации сборок выпуска, но иногда может быть полезно убедиться, что оптимизация отключена для локальной функции (но не для всего проекта, сняв 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). Связанный последующий вопрос заключается в том, является ли эквивалент для:

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

3 ответов


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

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

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


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

using System.Runtime.CompilerServices;

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

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

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