Вы можете использовать Conditional
в Foo
для украшения метода - любые вызовы этого метода будут зависеть от того, определяет ли код , вызывающий соответствующий символ. Так что-то вроде:
[Conditional("DEBUG")]
public void MaybeSetDebugMode()
{
// Remember the decision
}
Тогда вызывающий код может безоговорочно написать код вызова MaybeSetDebugMode
, и вызов будет только на самом деле скомпилирован, если DEBUG
определено, когда вызывающий код скомпилирован. Сам метод в Foo
будет скомпилирован в Foo.dll
независимо от символов, определенных при его компиляции.
Это не то же самое, что #if
, который зависит от символы при компиляции кода.
Обратите внимание, что именно так Debug.WriteLine
и c работают.
Один недостаток: код Абсолютно будет существовать в "окончательной сборке", если вы не предпримете больше действий. Это связано с тем, что существование кода в Foo.dll не может измениться в зависимости от того, что его вызывает.
Так что вы можете на самом деле захотите использовать, например, #if
:
#if FINAL_BUILD
public void MaybeSetDebugMode()
{
// This method exists so that the calling code will still build
// with the final DLL, but there won't be any "interesting" code
// for anyone to find.
}
#else
public void MaybeSetDebugMode()
{
// Interesting code goes here. This code won't be included in the final build,
// but callers can call it unconditionally, because there'll be an empty
// method in the final build.
}
#endif