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