编译器在优化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)版本中。一个相关的后续问题是是否等同于:
* projects targeting .NET 3.0 or earlier?
* projects deployed to a device such as Windows CE 6.0 using the .NET 3.5 CF?
答案 0 :(得分:29)
您可以使用[MethodImpl(MethodImplOptions.NoOptimization)]
和[MethodImpl(MethodImplOptions.NoInlining)]
修饰特定方法(或属性getter / setter),这将阻止JITter优化和内联方法:
[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
private void MethodWhichShouldNotBeOptimized()
{ }
但是,没有办法将此属性应用于代码块。此外,在.NET 3.5中添加了NoOptimization
属性,这对于遗留代码或Compact Framework可能很重要。
答案 1 :(得分:6)
有一个C# Preprocessor Directives列表。没有确切的等价物,但是可以使用MethodImplAttribute执行此操作并将NoOptimization
MethodImplOptions传递给它:
using System.Runtime.CompilerServices;
class MyClass
{
[MethodImplAttribute(MethodImplOptions.NoOptimization)]
public void NonOptimizeMethod()
{
// Do some stuff
}
}
答案 2 :(得分:4)
在c#中没有与#pragma指令等价的东西。您所能做的就是方法范围禁用。 MethodImpl位于System.Runtime.CompilerServices中。
[MethodImpl(MethodImplOptions.NoOptimization)]
void TargetMethod ()