"Только отладочный" код, который должен запускаться только при включении "

Я хотел бы добавить код С# "только отладка", который запускается только в том случае, если пользователь отлаживает его. В С++ я делал что-то похожее на следующее:

void foo()
{   
  // ...
#ifdef DEBUG
  static bool s_bDoDebugOnlyCode = false;
  if (s_bDoDebugOnlyCode)
  {
      // Debug only code here gets executed when the person debugging 
      // manually sets the bool above to true.  It then stays for the rest
      // of the session until they set it to false.
  }
#endif
 // ...
}

Я не могу сделать то же самое в С#, поскольку локальная статика не существует.

Вопрос. Каков наилучший способ выполнить это на С#?

  • Должен ли я использовать статическое поле частного класса с директивами препроцессора С# (# if/# endif DEBUG)?
  • Должен ли я использовать условный атрибут (для хранения кода), а затем статическое поле частного класса ( не, окруженное директивами препроцессора С# #, если /# endif DEBUG?).
  • Что-то еще?

Ответ 1

Переменная экземпляра, вероятно, будет способом делать то, что вы хотите. Вы можете сделать его статическим, чтобы сохранить то же значение для жизни программы (или потока в зависимости от вашей модели статической памяти), или сделать его обычным экземпляром var, чтобы контролировать его в течение срока действия экземпляра объекта. Если этот экземпляр является одиночным, они будут вести себя одинаково.

#if DEBUG
private /*static*/ bool s_bDoDebugOnlyCode = false;
#endif

void foo()
{   
  // ...
#if DEBUG
  if (s_bDoDebugOnlyCode)
  {
      // Code here gets executed only when compiled with the DEBUG constant, 
      // and when the person debugging manually sets the bool above to true.  
      // It then stays for the rest of the session until they set it to false.
  }
#endif
 // ...
}

Просто для того, чтобы быть полным, прагмы (директивы препроцессора) считаются небольшим количеством kludge для управления потоком программы. У .NET есть встроенный ответ для половины этой проблемы, используя атрибут "Условный".

private /*static*/ bool doDebugOnlyCode = false; 
[Conditional("DEBUG")]
void foo()
{   
  // ...    
  if (doDebugOnlyCode)
  {
      // Code here gets executed only when compiled with the DEBUG constant, 
      // and when the person debugging manually sets the bool above to true.  
      // It then stays for the rest of the session until they set it to false.
  }    
  // ...
}

Нет прагм, намного чище. Недостатком является то, что Conditional может применяться только к методам, поэтому вам придется иметь дело с логической переменной, которая ничего не делает в сборке релиза. Поскольку переменная существует только для переключения с хоста VS-исполнения, а в релиз-сборке его значение не имеет значения, оно довольно безвредно.

Ответ 2

То, что вы ищете, это

[ConditionalAttribute("DEBUG")]

атрибут.

Если вы, например, напишите метод, например:

[ConditionalAttribute("DEBUG")]
public static void MyLovelyDebugInfoMethod(string message)
{
    Console.WriteLine("This message was brought to you by your debugger : ");
    Console.WriteLine(message);
}

любой вызов, который вы делаете для этого метода внутри вашего собственного кода, будет выполняться только в режиме отладки. Если вы создадите свой проект в режиме выпуска, даже вызов в "MyLovelyDebugInfoMethod" будет проигнорирован и выгружен из вашего двоичного файла.

О, и еще одна вещь, если вы пытаетесь определить, будет ли ваш код в настоящее время отлаживаться в момент выполнения, также можно проверить, подключен ли текущий процесс JIT. Но это все вместе другое дело. Опубликуйте комментарий, если это то, что вы пытаетесь сделать.

Ответ 3

Вы можете попробовать это, если вам нужен только код для запуска, когда у вас есть отладчик, подключенный к процессу.

if (Debugger.IsAttached)
{
     // do some stuff here
}

Ответ 4

Если вы хотите узнать, есть ли отладка, везде в программе. Используйте это.

Объявить глобальную переменную.

bool isDebug=false;

Создать функцию проверки режима отладки

[ConditionalAttribute("DEBUG")]
    public static void isDebugging()
    {
        isDebug = true;
    }

В методе инициализации вызовите функцию

isDebugging();

Теперь во всей программе. Вы можете проверить наличие отладки и выполнить операции. Надеюсь, это поможет!

Ответ 5

Я думаю, что стоит упомянуть, что [ConditionalAttribute] находится в пространстве имен System.Diagnostics;. Я немного споткнулся, когда получил:

Error 2 The type or namespace name 'ConditionalAttribute' could not be found (are you missing a using directive or an assembly reference?)

после его использования в первый раз (я думал, что это было бы в System).