다음을 통해 공유


관리 코드의 어설션

어설션 또는 Assert 문은 Assert 문에 대한 인수로 지정하는 조건을 테스트합니다. 조건이 true로 평가되면 동작이 발생하지 않고, 조건이 false로 평가되면 어설션이 실패합니다. 디버그 빌드를 사용하여 이를 실행하는 경우 프로그램은 중단 모드로 전환됩니다.

이 항목에서

System.Diagnostics 네임스페이스의 어설션

Debug.Assert 메서드

Debug.Assert의 부작용

추적 및 디버그 요구 사항

인수 단언

어설션 동작 사용자 지정

구성 파일에서 어설션 설정

System.Diagnostics 네임스페이스의 어설션

Visual Basic 및 Visual C#에서는 System.Diagnostics 네임스페이스에 있는 Assert 메서드를 Debug 또는 Trace에서 사용할 수 있습니다. Debug 클래스 메서드는 프로그램의 릴리스 버전에 포함되지 않으므로 크기를 늘리거나 릴리스 코드의 속도를 줄이지 않습니다.

C++는 클래스 메서드를 Debug 지원하지 않습니다. 다음과 같은 #ifdef DEBUG#endif조건부 컴파일과 함께 클래스를 Trace 사용하여 동일한 효과를 얻을 수 있습니다.

이 항목에서

Debug.Assert 메서드

코드가 정확한 경우 true로 유지되어야 하는 조건을 테스트하려면 System.Diagnostics.Debug.Assert 메서드를 사용합니다. 예를 들어 정수 나누기 함수를 작성한다고 가정합니다. 수학의 규칙에 따라 0으로는 나눌 수 없습니다. 어설션을 사용하여 테스트할 수 있습니다.

int IntegerDivide ( int dividend , int divisor )
{
    Debug.Assert ( divisor != 0 );
    return ( dividend / divisor );
}

디버거에서 이 코드를 실행하면 어설션 문이 평가되지만 릴리스 버전에서는 비교가 수행되지 않으므로 추가 오버헤드가 없습니다.

다음은 또 다른 예입니다. 다음과 같이 검사 계정을 구현하는 클래스가 있습니다.

float balance = savingsAccount.Balance;
Debug.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );

계좌에서 돈을 인출하기 전에 계정 잔액이 인출 준비 금액을 충당하기에 충분한지 확인하려고 합니다. 어설션을 작성하여 잔액을 확인할 수 있습니다.

float balance = savingsAccount.Balance;
Trace.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );

코드의 릴리스 버전을 만들 때 System.Diagnostics.Debug.Assert 메서드에 대한 호출이 사라진다는 점을 유의하십시오. 즉, 잔액을 확인하는 호출이 릴리스 버전에서 사라집니다. 이 문제를 해결하려면, 릴리스 버전에서 사라지지 않는 System.Diagnostics.Trace.Assert으로 System.Diagnostics.Debug.Assert를 교체해야 합니다.

System.Diagnostics.Trace.Assert 호출은 System.Diagnostics.Debug.Assert와 달리 릴리스 버전에 오버헤드를 추가합니다.

이 항목에서

Debug.Assert의 부작용

System.Diagnostics.Debug.Assert를 사용할 때, 프로그램의 결과가 변경되지 않도록 Assert가 제거되었을 때 Assert 내부 코드가 변하지 않는지 확인하세요. 그렇지 않으면 프로그램의 릴리스 버전에만 표시되는 버그가 실수로 발생할 수 있습니다. 특히 다음 예제와 같이 함수 또는 프로시저 호출을 포함하는 어설션에 주의해야 합니다.

// unsafe code
Debug.Assert (meas(i) != 0 );

이 사용 System.Diagnostics.Debug.Assert 은 언뜻 보기에 안전해 보일 수 있지만 함수 meas가 호출될 때마다 카운터를 업데이트한다고 가정합니다. 릴리스 버전을 빌드할 때 meas에 대한 이 호출이 제거되므로 카운터가 업데이트되지 않습니다. 부작용이 있는 함수의 예입니다. 부작용이 있는 함수에 대한 호출을 제거하면 릴리스 버전에만 나타나는 버그가 발생할 수 있습니다. 이러한 문제를 방지하려면 문에 함수 호출을 System.Diagnostics.Debug.Assert 배치하지 마세요. 대신 임시 변수를 사용합니다.

temp = meas( i );
Debug.Assert ( temp != 0 );

System.Diagnostics.Trace.Assert를 사용하더라도 Assert 문 내에 함수 호출을 배치하지 않는 것이 좋습니다. 릴리스 빌드에서 문이 제거되지 않으므로 이러한 호출은 안전 System.Diagnostics.Trace.Assert 해야 합니다. 그러나 습관의 문제로 이러한 구문을 피하면 사용할 System.Diagnostics.Debug.Assert때 실수를 할 가능성이 적습니다.

이 항목에서

추적 및 디버그 요구 사항

Visual Studio 마법사를 사용하여 프로젝트를 만드는 경우 TRACE 기호는 릴리스 및 디버그 구성 모두에서 기본적으로 정의됩니다. DEBUG 기호는 디버그 빌드에서만 기본적으로 정의됩니다.

그렇지 않으면 Trace 메서드가 작동하려면 프로그램에 원본 파일의 맨 위에 다음 중 하나가 있어야 합니다.

  • #Const TRACE = True Visual Basic 안에서

  • #define TRACE Visual C# 및 C++에서

    또는 TRACE 옵션을 사용하여 프로그램을 빌드해야 합니다.

  • /d:TRACE=True Visual Basic에서

  • /d:TRACE Visual C# 및 C++에서

    C# 또는 Visual Basic Release 빌드에서 디버그 메서드를 사용해야 하는 경우 릴리스 구성에서 DEBUG 기호를 정의해야 합니다.

    C++는 클래스 메서드를 Debug 지원하지 않습니다. 다음과 같은 #ifdef DEBUG#endif조건부 컴파일과 함께 클래스를 Trace 사용하여 동일한 효과를 얻을 수 있습니다. 프로젝트 속성 페이지 대화 상자에서 이러한 기호를 정의할 <수 있습니다.> 자세한 내용은 Visual Basic 디버그 구성에 대한 프로젝트 설정 변경 또는 C 또는 C++ 디버그 구성에 대한 프로젝트 설정 변경을 참조하세요.

인수 확인

System.Diagnostics.Trace.AssertSystem.Diagnostics.Debug.Assert는 최대 3개의 인수를 받습니다. 필수인 첫 번째 인수는 확인하려는 조건입니다. 인수를 하나만 호출 System.Diagnostics.Trace.Assert(Boolean) 하거나 System.Diagnostics.Debug.Assert(Boolean) 사용하는 경우 메서드는 Assert 조건을 확인하고 결과가 false이면 호출 스택의 내용을 출력 창에 출력합니다. 다음 예제에서는 다음을 보여줍니다System.Diagnostics.Trace.Assert(Boolean).System.Diagnostics.Debug.Assert(Boolean)

Debug.Assert ( stacksize > 0 );
Trace.Assert ( stacksize > 0 );

두 번째 및 세 번째 인수(있는 경우)는 문자열이어야 합니다. 두 개 또는 세 개의 인수를 호출 System.Diagnostics.Trace.Assert 하거나 System.Diagnostics.Debug.Assert 사용하는 경우 첫 번째 인수는 조건입니다. 메서드는 조건을 확인하고 결과가 false이면 두 번째 문자열과 세 번째 문자열을 출력합니다. 다음 예제에서는 두 인수를 사용하여 System.Diagnostics.Debug.Assert(Boolean, String)System.Diagnostics.Trace.Assert(Boolean, String)가 표시됩니다.

Debug.Assert ( stacksize > 0, "Out of stack space" );
Trace.Assert ( stacksize > 0, "Out of stack space" );

다음 예제에서는 System.Diagnostics.Debug.Assert(Boolean, String, String) 세 개의 인수와 System.Diagnostics.Trace.Assert(Boolean, String, String) 함께 사용하고 있습니다.

Debug.Assert ( stacksize > 100, "Out of stack space" , "Failed in inctemp" );
Trace.Assert ( stacksize > 0, "Out of stack space", "Failed in inctemp" );

이 항목에서

어설션 동작 사용자 지정

사용자 인터페이스 모드 Assert 에서 애플리케이션을 실행하는 경우 조건이 실패하면 메서드 에 어설션 실패 대화 상자가 표시됩니다. 어설션이 실패할 때 발생하는 작업은 Listeners 속성이나 Listeners 속성에 의해 제어됩니다.

컬렉션에 개체를 TraceListener 추가하거나, 컬렉션에서 Listeners 개체를 TraceListener 제거하거나, 다르게 동작하도록 Listeners 기존 메서드를 재정의하여 System.Diagnostics.TraceListener.Fail 출력 동작을 TraceListener 사용자 지정할 수 있습니다.

예를 들어 System.Diagnostics.TraceListener.Fail 메서드를 재정의하여 어설션 실패 대화 상자를 표시하는 대신 이벤트 로그에 기록할 수 있습니다.

이러한 방식으로 출력을 사용자 지정하려면 프로그램에 수신기가 포함되어야 하며, TraceListener를 상속하고 그 System.Diagnostics.TraceListener.Fail 메서드를 재정의해야 합니다.

자세한 내용은 추적 수신기를 참조하세요.

이 항목에서

구성 파일에서 어설션 설정

프로그램 구성 파일과 코드에서 어설션을 설정할 수 있습니다. 자세한 내용은 System.Diagnostics.Trace.Assert 또는 System.Diagnostics.Debug.Assert참조하세요.