C# 省略代码:条件属性和预处理指令之间有什么区别吗?

C# 省略代码:条件属性和预处理指令之间有什么区别吗?,c#,debugging,c-preprocessor,compiler-directives,C#,Debugging,C Preprocessor,Compiler Directives,我想知道他们之间有什么区别 #define MYSYMBOL #if MYSYMBOL public void foo () { // ... } #endif 及 ? 也许这很明显,但如果有人能给我一个正确的方向的提示,我会很感激:)他们是不同的 使用#if会完全删除附带的代码,因此调用该方法的任何代码都不会编译,因为该方法已消失。您还可以通过这种方式包装任意数量的代码,而不仅仅是一个完整的方法 使用[Conditional]意味着不会在运行时调用该方法,但对它的调用仍将编译(但

我想知道他们之间有什么区别

#define MYSYMBOL

#if MYSYMBOL
public void foo () {

    // ...
}
#endif

?

也许这很明显,但如果有人能给我一个正确的方向的提示,我会很感激:)

他们是不同的

使用
#if
会完全删除附带的代码,因此调用该方法的任何代码都不会编译,因为该方法已消失。您还可以通过这种方式包装任意数量的代码,而不仅仅是一个完整的方法


使用
[Conditional]
意味着不会在运行时调用该方法,但对它的调用仍将编译(但调用不会在IL代码中发出)。同样,通过这种方式,该方法必须返回
void
,并且没有任何
out
ref
参数。

它们是不同的

使用
#if
会完全删除附带的代码,因此调用该方法的任何代码都不会编译,因为该方法已消失。您还可以通过这种方式包装任意数量的代码,而不仅仅是一个完整的方法


使用
[Conditional]
意味着不会在运行时调用该方法,但对它的调用仍将编译(但调用不会在IL代码中发出)。同样,通过这种方式,方法必须返回
void
,并且没有任何
out
ref
参数。

是的,有一个很大的区别:使用
\if
指令,方法根本不编译;它只是不在编译代码中。使用
Conditional
属性,可以编译该方法,但是否调用它取决于客户端代码中的符号。如果调用代码中未定义符号,则会删除调用站点,并且不会调用该方法


例如,这对于将根据是否定义调试符号来调用或不调用的库代码非常有用。方法就是一个例子:只有在使用调试符号编译项目时才会调用该方法,但无论是否定义了符号,该方法仍然存在于System.dll中。

是的,有一个很大的区别:使用
\if
指令,该方法根本不编译;它只是不在编译代码中。使用
Conditional
属性,可以编译该方法,但是否调用它取决于客户端代码中的符号。如果调用代码中未定义符号,则会删除调用站点,并且不会调用该方法


例如,这对于将根据是否定义调试符号来调用或不调用的库代码非常有用。该方法就是一个例子:仅当使用调试符号编译项目时才会调用该方法,但无论是否定义了符号,该方法仍存在于System.dll中。

“对它的调用仍将编译”:严格来说这不是真的,因为调用站点在编译时被删除。。。但我明白你的意思;)@Thomasleveque谢谢-我已经澄清了一点:)“对它的调用仍然会编译”:严格来说这不是真的,因为调用站点在编译时被删除了。。。但我明白你的意思;)@托马斯列夫式谢谢-我已经澄清了一点:)
#define MYSYMBOL

[Conditional("MYSYMBOL")]
public void foo () {

    // ...
}