違いは何だろうか
#define MYSYMBOL
#if MYSYMBOL
public void foo () {
// ...
}
#endif
と
#define MYSYMBOL
[Conditional("MYSYMBOL")]
public void foo () {
// ...
}
?
当たり前のことかもしれませんが、誰かが正しい方向へのヒントをくれたら、ありがたいです:)
違いは何だろうか
#define MYSYMBOL
#if MYSYMBOL
public void foo () {
// ...
}
#endif
と
#define MYSYMBOL
[Conditional("MYSYMBOL")]
public void foo () {
// ...
}
?
当たり前のことかもしれませんが、誰かが正しい方向へのヒントをくれたら、ありがたいです:)
彼らは違う。
を使用#if
すると、囲まれたコードが完全に削除されるため、メソッドが消えたため、メソッドを呼び出すコードはコンパイルされません。この方法では、単一のメソッド全体だけでなく、任意の量のコードをラップすることもできます。
使用[Conditional]
とは、メソッドが実行時に呼び出されないことを意味しますが、メソッドへの呼び出しはコンパイルされます(ただし、呼び出しはILコードで発行されません)。また、このように、メソッドは戻り値であり、またはパラメーターvoid
を持たない必要があります。out
ref
はい、大きな違いがあります#if
。ディレクティブでは、メソッドはまったくコンパイルされません。コンパイルされたコードにはありません。このConditional
属性を使用すると、メソッドがコンパイルされますが、呼び出されるかどうかは、クライアントコードのシンボルによって異なります。シンボルが呼び出し元のコードで定義されていない場合、呼び出しサイトは削除され、メソッドは呼び出されません。
これは、たとえば、DEBUGシンボルが定義されているかどうかに基づいて呼び出されるかどうかに基づいて呼び出されるライブラリコードの場合に役立ちます。例としてDebug.Print
メソッドがあります。プロジェクトがDEBUGシンボルでコンパイルされている場合にのみ呼び出されますが、シンボルが定義されているかどうかに関係なく、メソッドはSystem.dllにあります。