0

違いは何だろうか

#define MYSYMBOL

#if MYSYMBOL
public void foo () {

    // ...
}
#endif

#define MYSYMBOL

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

    // ...
}

当たり前のことかもしれませんが、誰かが正しい方向へのヒントをくれたら、ありがたいです:)

4

2 に答える 2

5

彼らは違う。

を使用#ifすると、囲まれたコードが完全に削除されるため、メソッドが消えたため、メソッドを呼び出すコードはコンパイルされません。この方法では、単一のメソッド全体だけでなく、任意の量のコードをラップすることもできます。

使用[Conditional]とは、メソッドが実行時に呼び出されないことを意味しますが、メソッドへの呼び出しはコンパイルされます(ただし、呼び出しはILコードで発行されません)。また、このように、メソッドは戻り値であり、またはパラメーターvoidを持たない必要があります。outref

于 2012-06-10T15:19:50.777 に答える
1

はい、大きな違いがあります#if。ディレクティブでは、メソッドはまったくコンパイルされません。コンパイルされたコードにはありません。このConditional属性を使用すると、メソッドがコンパイルされますが、呼び出されるかどうかは、クライアントコードのシンボルによって異なります。シンボルが呼び出し元のコードで定義されていない場合、呼び出しサイトは削除され、メソッドは呼び出されません。

これは、たとえば、DEBUGシンボルが定義されているかどうかに基づいて呼び出されるかどうかに基づいて呼び出されるライブラリコードの場合に役立ちます。例としてDebug.Printメソッドがあります。プロジェクトがDEBUGシンボルでコンパイルされている場合にのみ呼び出されますが、シンボルが定義されているかどうかに関係なく、メソッドはSystem.dllにあります。

于 2012-06-10T15:20:56.233 に答える