Можно ли создать метод только для отладки в .NET? - PullRequest
9 голосов
/ 17 сентября 2009

Можно ли создать метод, который выполняет помощь при отладке, например класс System.Diagnostics.Debug?

Я ищу способ создания метода, который при вызове сборки, скомпилированной с определенным условным символом DEBUG, приводит к операции, и которая не работает при вызове сборки без определенного символа .

Если возможно, я бы хотел, чтобы вызовы методов отладки добавляли минимальные накладные расходы или увеличивали размер к выпускной версии сборки.

Для пояснения, методы отладки должны быть в сборке, скомпилированной в режиме Release. Вызовы методов должны генерировать операции только при вызове из сборки с символом DEBUG, определенным в области вызова метода.

Ответы [ 5 ]

31 голосов
/ 17 сентября 2009

Добавьте атрибут Conditional к методу, например:

[Conditional("DEBUG")]
public void Whatever() {
    //...
}

Обратите внимание, что метод должен возвращать void и не может иметь никаких параметров out; в противном случае было бы невозможно удалить звонок на него.

Метод будет скомпилирован в сборку, но CLS-совместимые компиляторы будут отправлять вызовы метода только в том случае, если для компилируемых сборок определен DEBUG. Обратите внимание, что компилятор C ++ не совместим с CLS и всегда будет выдавать вызов.

6 голосов
/ 17 сентября 2009

ConditionalAttribute

Кстати, код вызываемого метода остается в сборке - это вызовы, которые удаляются во время компиляции

Бонусная тематическая запись в блоге: http://blogs.msdn.com/ericlippert/archive/2009/09/10/what-s-the-difference-between-conditional-compilation-and-the-conditional-attribute.aspx

3 голосов
/ 17 сентября 2009

Если вы разберете класс System.Diagnostics.Debug с помощью Reflector , вы увидите, что это делается с помощью атрибута [Conditional("DEBUG")]:

public sealed class Debug
{
    private Debug();
    [Conditional("DEBUG")]
    public static void Assert(bool condition);
    // etc...
}
1 голос
/ 18 сентября 2009

Если вам нужна другая подпись, кроме void func (..) без параметров out, что было бы не так с

MyDebugObject Foo(out int justForGrins)
{
    justForGrins = <safe value for release builds>;
    MyDebugObject result = <safe value for release builds>;
    #if DEBUG
     .. run code you need for your debugging...
    #endif
     return result;
}

Он более многословен и менее элегантен, чем ConditionalAttribute, но он позволит вам более гибкую подпись.

0 голосов
/ 24 сентября 2015

Почему бы не попробовать что-то подобное?

#if DEBUG
        private void DebugLog(string message)
        {
            // do whatever u want.
        }
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...