Использование директив предварительного компилятора в C# для переключения функций отладки

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

Верно ли, что С# не поддерживает все команды прекомпилятора C, т. е. #if X > Y и т. д.? Мой приведенный ниже код выдает ошибки компилятора. Можно ли использовать директивы прекомпилятора для переключения функций в моем приложении?

Мое решение - это очень "С++/C" способ достижения этой функциональности. Каков способ С# для достижения этой функциональности?

#define DEBUG                   1 // Not allowed to assign values to constants?
#define USE_ALTERNATE_METHOD    0

public class MyApplication
{
    public MyApplication()
    {
        #if DBEUG > 0 // Not allowed these kinds of directives?
            RegressionTests.Run();
        #endif // DEBUG > 0
    }

    public void myMethod
    {
        #if USE_ALTERNATE_METHOD > 0
            // Do alternate stuff
        #else 
            // Do regular stuff
        #endif // USE_ALTERNATE_METHOD > 0
    }
}

person sazr    schedule 28.10.2013    source источник


Ответы (1)


Указание только #if DEBUG делает работу.

Вы не можете использовать дефинитивы препроцессора, такие как #define DEBUG 1 .

Однако вы можете просто указать #define DEBUG или #define CustomDefinition и использовать его с атрибутом Conditional.

Eg,

Вы можете просто сделать это:

#if DEBUG
Console.WriteLine("This will work in DEBUG mode alone");
#endif

Или вы можете указать conditional-attributes поверх метода, который вы хотите выполнять только в режиме отладки.

Eg,

[Conditional("DEBUG")]
void ExecuteOnlyInDebugMode()
{
     // do stuff you wanna do.
}

Для вашего примера это должно быть так:

#define DEBUG                  
#define USE_ALTERNATE_METHOD       
public class MyApplication
{
    public MyApplication()
    {
        #if DEBUG
            RegressionTests.Run();
        #endif 
    }

    public void myMethod
    {
        #if USE_ALTERNATE_METHOD 
            // Do alternate stuff
            //do not execute the following. just return.
        #endif
            // Do regular stuff

    }
}

Вы можете найти дополнительную информацию здесь . Красиво объяснил.

Кроме того, читайте больше об атрибуте Conditional здесь.

person now he who must not be named.    schedule 28.10.2013
comment
Но разве это не означает, что если я хочу отключить USE_ALTERNATE_METHOD, я должен полностью удалить эту строку/определение, а не просто изменить его значение с 1 на 0 - person sazr; 28.10.2013
comment
Ага, you have to do that. - person now he who must not be named.; 28.10.2013