#ifdef в C #


116

Я хотів би зробити нижче, але в C # замість C ++

#ifdef _DEBUG
bool bypassCheck=TRUE_OR_FALSE;//i will decide depending on what i am debugging
#else
bool bypassCheck = false; //NEVER bypass it
#endif
c# 

Перевірте також цю чудову відповідь , вона показує, як ви можете додавати символи налагодження на основі умов через файл проекту (.csproj).
Метт

Відповіді:


162
#if DEBUG
bool bypassCheck=TRUE_OR_FALSE;//i will decide depending on what i am debugging
#else
bool bypassCheck = false; //NEVER bypass it
#endif

Переконайтеся, що у вас є прапорець, щоб визначити DEBUG, встановлений у ваших властивостях збірки.


51

Я рекомендую вам використовувати умовний атрибут !

Оновлення: через 3,5 роки

Ви можете використовувати #ifтак ( наприклад, скопійований з MSDN ):

// preprocessor_if.cs
#define DEBUG
#define VC_V7
using System;
public class MyClass 
{
    static void Main() 
    {
#if (DEBUG && !VC_V7)
        Console.WriteLine("DEBUG is defined");
#elif (!DEBUG && VC_V7)
        Console.WriteLine("VC_V7 is defined");
#elif (DEBUG && VC_V7)
        Console.WriteLine("DEBUG and VC_V7 are defined");
#else
        Console.WriteLine("DEBUG and VC_V7 are not defined");
#endif
    }
}

Корисний лише для виключення частин методів.

Якщо ви використовуєте #ifдля виключення якогось методу з компіляції, вам доведеться виключити з компіляції всі фрагменти коду, які також викликають цей метод (іноді ви можете завантажувати деякі класи під час виконання, і ви не можете знайти абонента з "Знайти всі посилання"). Інакше будуть помилки.

Якщо ви використовуєте умовну компіляцію з іншого боку, ви все одно можете залишити всі фрагменти коду, які викликають метод. Усі параметри все ще будуть перевірені компілятором. Метод просто не буде викликаний під час виконання . Я думаю, що спосіб краще приховати метод лише один раз і не потрібно видаляти весь код, який його також викликає. Вам заборонено використовувати умовний атрибут для методів, які повертають значення - лише для методів void. Але я не думаю, що це велике обмеження, тому що якщо ви використовуєте #ifметод, який повертає значення, ви повинні приховати всі фрагменти коду, які викликають його.

Ось приклад:

    // виклик Class1.ConditionalMethod () буде ігноруватися під час виконання 
    // якщо не визначена константа DEBUG


    за допомогою System.Diagnostics;
    клас Клас1 
    {
       [Умовно ("DEBUG")]
       загальнодоступна статична недійсність ConditionalMethod () {
          Console.WriteLine ("Виконаний клас1.ConditionalMethod");
       }
    }

Підсумок:

Я б використовував #ifdefу C ++, але з C # / VB я би використовував умовний атрибут. Таким чином ви приховуєте визначення методу, не приховуючи фрагменти коду, які його викликають. Код виклику все ще компілюється і перевіряється компілятором, хоча метод не викликається під час виконання. Ви можете використовувати, #ifщоб уникнути залежностей, оскільки за допомогою атрибута Conditional ваш код все ще компілюється.


1
+1 Це дійсно добре, але має обмеження, наприклад, коли ви намагаєтесь повернути значення з умовного методу (наскільки я це розумію). Думаю, допоможе вкладний приклад.
Гаміш Грубіян

1
Це також не заважає компілювати код, він просто не дозволяє цей код. Відмінність важлива, коли ви хочете зняти залежності та таке.
Лі Лув'є

1

У C # є препроцесор. Він працює трохи по-іншому, ніж у C ++ та C.

Ось посилання MSDN - розділ про всі директиви препроцесора .


11
Це другорядний момент, але C # НЕ має препроцесора. # директиви обробляються головним компілятором так, ніби був препроцесор. Дивіться тут: msdn.microsoft.com/en-us/library/ed8yd1ha.aspx Основним результатом цього розрізнення є те, що макроси стилів c / c ++ не працюють.
Саймон П Стівенс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.