Это действительно зависит от того, что вы собираетесь:
#if DEBUG
: код здесь даже не достигнет IL при выпуске. [Conditional("DEBUG")]
: Этот код достигнет IL, однако вызовет для метода будет опущен, если только DEBUG не будет установлен при компиляции вызывающего.
Лично я использую оба в зависимости от ситуации:
Условный ("DEBUG") Пример: Я использую это, чтобы мне не пришлось возвращаться и редактировать свой код позже во время выпуска, но во время отладки я хочу быть уверен, что яне сделал никаких опечаток.Эта функция проверяет, правильно ли я ввожу имя свойства, когда пытаюсь использовать его в своем материале INotifyPropertyChanged.
[Conditional("DEBUG")]
[DebuggerStepThrough]
protected void VerifyPropertyName(String propertyName)
{
if (TypeDescriptor.GetProperties(this)[propertyName] == null)
Debug.Fail(String.Format("Invalid property name. Type: {0}, Name: {1}",
GetType(), propertyName));
}
Вы действительно не хотите создавать функцию, используя #if DEBUG
, если вы не хотите обернуть всевызов этой функции с тем же #if DEBUG
:
#if DEBUG
public void DoSomething() { }
#endif
public void Foo()
{
#if DEBUG
DoSomething(); //This works, but looks FUGLY
#endif
}
против:
[Conditional("DEBUG")]
public void DoSomething() { }
public void Foo()
{
DoSomething(); //Code compiles and is cleaner, DoSomething always
//exists, however this is only called during DEBUG.
}
# если пример DEBUG: Я использую это при попыткенастроить различные привязки для связи WCF.
#if DEBUG
public const String ENDPOINT = "Localhost";
#else
public const String ENDPOINT = "BasicHttpBinding";
#endif
В первом примере весь код существует, но он просто игнорируется, если не включен DEBUG.Во втором примере const ENDPOINT установлен на «Localhost» или «BasicHttpBinding» в зависимости от того, установлен ли DEBUG или нет.
Обновление: я обновляю этот ответ, чтобы прояснить важный и хитрый момент,Если вы решите использовать ConditionalAttribute
, имейте в виду, что вызовы пропускаются во время компиляции, а не время выполнения .То есть:
MyLibrary.dll
[Conditional("DEBUG")]
public void A()
{
Console.WriteLine("A");
B();
}
[Conditional("DEBUG")]
public void B()
{
Console.WriteLine("B");
}
Когда библиотека скомпилирована в режиме выпуска (то есть без символа DEBUG), она всегда будет вызывать B()
из A()
опущен, даже если вызов A()
включен, поскольку в вызывающей сборке определен DEBUG.