[C#] Debug용 코드

#if, #endif로 디버그와 릴리즈용 컴파일을 구별할 수 있다.

[code language=”csharp”]
using System;

namespace CSharpConsole
{
class Program
{
static void Main(string[] args)
{
#if DEBUG
Console.WriteLine("Debug");
#endif
Console.WriteLine("Hello World!");
}
}
}
[/code]

위 코드를 Debug로 빌드하면 Debug와 Hello World!가 모두 출력되지만, Release로 빌드하면 Hello World!만 출력된다.

그러나 위와 같이 #if/#endif블록을 나누는 것은 보기에도 안좋고, 매우 눈에 띄어서 거슬린다.

이러한 작업을 C#에서는 어트리뷰트로 지원한다. 이 어트리뷰트를 이용하면 해당 어트리뷰트가 적용된 메서드나 클래스는 지정된 빌드에서만 컴파일된다. 가령 네트워크로 데이터를 보내기 위해서 byte 배열을 보내려는데, 중간에 데이터가 튀는 것 같아서 튀는 곳 주변에서 byte 배열의 값을 일일이 확인해보려고 한다. 이 코드는 디버깅시에만 필요하고 실제 릴리즈에는 필요가 없다.
이런 것을 (대충) 구현해보면 다음과 같다.

[code language=”csharp” highlight=”3,18″]
using System;
using System.Text;
using System.Diagnostics;

namespace CSharpConsole
{
class Program
{
static void Main(string[] args)
{
string str = "Hello World!";
byte[] bytes = Encoding.UTF8.GetBytes(str);

PrintBytes(bytes);

}

[Conditional("DEBUG")]
static void PrintBytes(byte[] bytes)
{
foreach (byte b in bytes)
Console.WriteLine(b);
}
}
}
[/code]

Debug로 컴파일을 하면 바이트가 쫘르르 뜨지만, Release로 컴파일 하면 뜨지 않는다.
Conditional 어트리뷰트를 콤마로 연결하면 OR가 된다. 따라서 위 코드를 Debug와 Release시에 출력하게 하려면 어트리뷰트를 다음과 같이 고치면 된다.
[code language=”csharp” highlight=”1″ gutter=”false”]
[Conditional("DEBUG"), Conditional("RELEASE")]
[/code]

사실 디버그, 릴리즈 말고 하나가 더 존재한다. TRACE라는게 있는데,
이것은 step into(F11), step over(F10)이다. 한 줄씩 코드를 실행하거나, 하나의 프로시저 단위로 코드를 실행할 때에 드러나게 하려면 Conditional(“TRACE”)를 사용하면 된다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다