单行#if #endif是什么意思?

3

在C#中有没有更快的方法来

#if foo
  Something();
#endif

类似伪代码:

#if(foo, DoThat(); )

我是一名程序员,而程序员往往比较懒惰 ;-)


3
你是说“更快”,是指“更短”吗? - Cid
1
是的,写起来更快 ;) - Crimson
典型的C#团队智慧是,你不应该使用的代码应该难以编写,并且像明显的疼痛一样突出,缺少缩进会警告读者。 POLA很重要。 - Hans Passant
1个回答

15

没有任何东西可以让你在一行中编写 #if ... #endif

如果只有在定义了 FOO 的情况下才应该调用 Something,则可以使用 ConditionalAttribute 进行修饰:

[Conditional("FOO")]
public void Something()
{
   ...
}

如果您这样做,编译器将删除所有对Something的调用,除非定义了FOO


尽量将所有的#if都放在一个地方,而不是散布在代码中。这不仅可以更容易地看出应用程序的行为如何随条件编译符号的定义而改变,还可以从大部分代码中去除#if噪音。

针对不同的目标(例如Thing.Foo.csThing.cs),在您的csproj文件中指定哪个版本应该被包含,这也可能是有意义的。


最后,请记住,代码的目的是为了被阅读和理解:专注于编写清晰易懂的代码,而不是花费最短时间编写的代码。长期来看,你会花更长的时间阅读自己的代码。


我的代码中那些#if是用于调试和跟踪函数开头和结尾的内容。 - Crimson
@Crimson 如果是这样的话,也许将你的调试和跟踪方法标记为[Conditional("FOO")]会更有意义?这样你就可以随意调用它们,而不需要任何#ifs,如果必要,编译器会将它们删除。例如,你的调试内容可能包括对Debug.Assert的调用,该方法被装饰为[Conditional("DEBUG")] - canton7
1
是的,已添加了[条件……]。你的答案是一个非常好的解决方案! - Crimson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接