C#中的条件编译技术可以获得无操作结果

Fre*_*ang 2 c# optimization conditional-compilation c-preprocessor

有没有人知道用C#中的无操作替换某些函数调用的好方法(通过反射或特殊属性)?

基本上,我想要做的就是这样

#ifdef DEBUG

StopWatch.start();

#endif

DoSomething();

#ifdef DEBUG

StopWatch.stop();
Log.TimingInfo(StopWatch);

#endif
Run Code Online (Sandbox Code Playgroud)

在我的代码中没有遍布很多ifdef.我可以用空对象模式替换它(我的StopWatch类)并有条件地为它分配空对象,但与代码中的严格无操作相比,这仍然不理想.代码路径长度在这里非常重要,当我们不尝试收集时序结果时,我宁愿牺牲一些读取能力来完全没有操作.

有没有人知道是否有办法在C#中标记我的StopWatch类或方法,以便在编译器评估时不发出代码?

Nat*_*nst 11

您可以使用以下[Conditional("DEBUG")]属性为您的方法添加注释:

class StopWatch
{
    [Conditional("DEBUG")]
    public void Start() { }

    [Conditional("DEBUG")]
    public void Stop() { }
}
Run Code Online (Sandbox Code Playgroud)

这与#ifdef DEBUG调用Start/的效果相同Stop.一个警告:条件方法必须返回void.还有一些其他限制.有关详细信息,请参阅ConditonalAttribute文档.