Это действительно зависит от того, что вы собираетесь:
#if DEBUG
: Код здесь даже не достигнет ИЛ на выпуск.
[Conditional("DEBUG")]
: Этот код достигнет ИЛ, однако вызовы к методу будут опущены, если 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.
}
#if Пример DEBUG: Я использую это при попытке установить различные привязки для связи WCF.
#if DEBUG
public const String ENDPOINT = "Localhost";
#else
public const String ENDPOINT = "BasicHttpBinding";
#endif
В первом примере код существует, но просто игнорируется, если DEBUG не включен. Во втором примере константа ENDPOINT установлена в «Localhost» или «BasicHttpBinding» в зависимости от того, установлен ли DEBUG или нет.
Update: Потому что этот ответ является наивысшим голосовала ответ на этот вопрос, я обновляя этот ответ прояснить важный и непростой момент. Если вы решите использовать 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 определен в вызывающей сборке.
См http://blogs.msdn.com/b/ericlippert/archive/2009/09/10/what-s-the- разницу между условным компиляцией и условным атрибутом.aspx для некоторых мыслей по этому вопросу. –
вы также можете использовать это: if (Debugger.IsAttached) {...} – sofsntp