Я хотів би зробити нижче, але в 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 # замість 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
Відповіді:
Я рекомендую вам використовувати умовний атрибут !
Оновлення: через 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 ваш код все ще компілюється.
У C # є препроцесор. Він працює трохи по-іншому, ніж у C ++ та C.
Ось посилання MSDN - розділ про всі директиви препроцесора .