아래 작업을하고 싶지만 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
답변
#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를 정의하는 확인란이 선택되어 있는지 확인하십시오.
답변
조건부 속성 을 사용하는 것이 좋습니다 !
업데이트 : 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 사용; 클래스 Class1 { [조건부 ( "DEBUG")] public static void ConditionalMethod () { Console.WriteLine ( "실행 된 Class1.ConditionalMethod"); } }
요약:
#ifdef
C ++에서 사용 하지만 C # / VB에서는 조건부 특성을 사용합니다. 이렇게하면 메서드 정의를 호출하는 코드를 숨길 필요없이 숨길 수 있습니다. 호출 코드는 여전히 컴파일러에 의해 컴파일되고 유효성이 검사되지만 메서드는 런타임에 호출되지 않습니다. #if
조건부 속성 을 사용 하면 코드가 여전히 컴파일되기 때문에 종속성을 피하는 데 사용할 수 있습니다 .