[c#] C #의 #ifdef

아래 작업을하고 싶지만 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");
       }
    }

요약:

#ifdefC ++에서 사용 하지만 C # / VB에서는 조건부 특성을 사용합니다. 이렇게하면 메서드 정의를 호출하는 코드를 숨길 필요없이 숨길 수 있습니다. 호출 코드는 여전히 컴파일러에 의해 컴파일되고 유효성이 검사되지만 메서드는 런타임에 호출되지 않습니다. #if조건부 속성 을 사용 하면 코드가 여전히 컴파일되기 때문에 종속성을 피하는 데 사용할 수 있습니다 .


답변

C #에는 전처리 기가 있습니다. C ++ 및 C와 약간 다르게 작동합니다.

다음은 모든 전 처리기 지시문 에 대한 섹션 인 MSDN 링크 입니다.


답변