[C#] C # if / then 지시어 대 디버그 대 릴리스

솔루션 속성에서 하나의 유일한 프로젝트에 대해 구성을 “릴리스”로 설정했습니다.

메인 루틴의 시작 부분 에이 코드가 있으며 “Mode = Debug”가 표시됩니다. 또한 맨 위에 두 줄이 있습니다.

#define DEBUG 
#define RELEASE

올바른 변수를 테스트하고 있습니까?

#if (DEBUG)
            Console.WriteLine("Mode=Debug"); 
#elif (RELEASE)
            Console.WriteLine("Mode=Release"); 
#endif

내 목표는 디버그 모드와 릴리스 모드를 기반으로 변수에 다른 기본값을 설정하는 것입니다.



답변

DEBUG/ _DEBUG는 이미 VS에 정의되어 있어야합니다.

#define DEBUG코드에서를 제거하십시오 . 해당 특정 빌드에 대한 빌드 구성에서 전처리기를 설정하십시오.

그것은 “모드 = 디버그”인쇄 이유 때문에 당신입니다 #define다음 건너 뜁니다 elif.

확인하는 올바른 방법은 다음과 같습니다.

#if DEBUG
    Console.WriteLine("Mode=Debug");
#else
    Console.WriteLine("Mode=Release");
#endif

확인하지 마십시오 RELEASE.


답변

기본적으로 Visual Studio는 프로젝트가 디버그 모드로 컴파일 된 경우 DEBUG를 정의하고 릴리스 모드 인 경우에는 정의하지 않습니다. RELEASE는 기본적으로 릴리스 모드에서 정의되지 않습니다. 다음과 같이 사용하십시오 :

#if DEBUG
  // debug stuff goes here
#else
  // release stuff goes here
#endif

릴리스 모드에서만 무언가를 수행하려는 경우 :

#if !DEBUG
  // release...
#endif

또한 특정 심볼이 정의 된 경우에만 [Conditional("DEBUG")]반환 void되도록 메소드에 속성을 사용할 수 있음을 지적하는 것이 좋습니다 . 심볼이 정의되지 않은 경우 컴파일러는 해당 메소드에 대한 모든 호출을 제거합니다.

[Conditional("DEBUG")]
void PrintLog() {
    Console.WriteLine("Debug info");
}

void Test() {
    PrintLog();
}


답변

#define지시문 을 찾는 것보다 다음과 같이 확인하는 것이 좋습니다.

if (System.Diagnostics.Debugger.IsAttached)
{
   //...
}
else
{
   //...
}

물론 경고를 사용하면 디버그 모드에서 무언가를 컴파일하고 배포 할 수 있지만 여전히 디버거가 연결되어 있지 않습니다.


답변

특히 #if에 대한 열렬한 팬이 아닙니다. 특히 디버그 빌드는 통과하지만 문제가 없다면 릴리스 빌드는 실패하는 문제가 발생하기 때문에 코드베이스에 모두 퍼뜨릴 경우 특히 그렇습니다.

그래서 여기에 내가 생각해 낸 것이 있습니다 ( C #의 #ifdef에서 영감을 얻음 ).

public interface IDebuggingService
{
    bool RunningInDebugMode();
}

public class DebuggingService : IDebuggingService
{
    private bool debugging;

    public bool RunningInDebugMode()
    {
        //#if DEBUG
        //return true;
        //#else
        //return false;
        //#endif
        WellAreWe();
        return debugging;
    }

    [Conditional("DEBUG")]
    private void WellAreWe()
    {
        debugging = true;
    }
}


답변

bool isDebug = false;
Debug.Assert(isDebug = true); // '=', not '=='

이 메소드 Debug.Assert에는 조건부 속성이 DEBUG있습니다. 정의되지 않은 경우 통화 및 할당 isDebug = true제거됩니다 .

기호가 정의되면 통화가 포함됩니다. 그렇지 않으면 호출 (호출 매개 변수 평가 포함)이 생략됩니다.

경우 DEBUG정의, isDebug로 설정 true(및 전달 Debug.Assert이 경우에 아무것도 안하는).


답변

빌드 유형에 정의 된 변수를 사용하려는 경우 두 줄을 제거해야합니다.

#define DEBUG
#define RELEASE 

… 이렇게하면 #if (DEBUG) 가 항상 참이됩니다.

또한 RELEASE에 대한 기본 조건부 컴파일 기호가 없습니다 . 프로젝트 속성으로 정의하려면 빌드 탭을 클릭 한 다음 일반 표제 아래의 조건부 컴파일 기호 텍스트 상자에 RELEASE를 추가하십시오 .

다른 옵션은 이것을하는 것입니다 …

#if DEBUG
    Console.WriteLine("Debug");
#else
    Console.WriteLine("Release");
#endif


답변

상단에서 당신의 정의를 제거

#if DEBUG
        Console.WriteLine("Mode=Debug");
#else
        Console.WriteLine("Mode=Release");
#endif