보간된 문자열을 어설션 메시지로 사용하는 것이 일반적입니다. 예를 들면 다음과 같습니다.
Debug.Assert(result != x, $"Unexpected result {result}");
그러나 이전 버전에서는 조건이 true일 경우에도 모든 호출에서 서식 지정 결과를 포함하여 메시지에 대한 문자열을 생성합니다. 그리고 어설션에 대한 일반적인 사용은 항상 사실이어야 하는 조건에 관한 것입니다.
C# 10은 문자열 외에도 사용자 지정 "처리기"를 대상으로 하는 기능을 포함하여 더 나은 문자열 보간을 지원합니다. .NET 6의 Debug 클래스에는 새 오버로드 메서드 Assert, WriteIf, 및 WriteLineIf가 있으며, 이 기능을 활용하여 메시지가 필요한 경우에만 보간된 문자열 서식 항목을 조건부로 평가합니다. C# 컴파일러는 이러한 새 오버로드를 선호합니다. 서식 항목이 변경 상태이고 어설션이 발생하지 않더라도 프로그램이 이러한 돌연변이를 사용하여 표시되는 경우 동작의 차이를 관찰할 수 있습니다.
이전 동작
다음 코드에서는 r.ToString()가 항상 호출됩니다.
Debug.Assert(true, $"{r.ToString()}");
새 동작
다음 코드 r.ToString() 에서는 조건이 false있는 경우에만 메시지가 필요하기 때문에 호출되지 않습니다.
Debug.Assert(true, $"{r.ToString()}");
도입된 버전
6.0 RC 1
파괴적 변경 유형
이 변경 사항은 소스 호환성에 영향을 줄 수 있습니다.
변경 이유
이 변경 내용은 성능을 향상시키기 위해 도입되었습니다.
권장 작업
Debug 메서드와 함께 사용하는 보간된 문자열은 공유 상태를 변경해서는 안 됩니다. (이러한 메서드는 DEBUG 컴파일 상수에 따라 조건부입니다.) 어떤 이유로 인해 이전 동작을 유지하는 것이 중요한 경우, 보간된 문자열 앞에 (string) 캐스트를 추가하세요. 이 캐스트는 컴파일러가 기존 오버로드에 바인딩하도록 하고 문자열이 항상 구체화되도록 합니다.
영향을 받는 API
- System.Diagnostics.Debug.Assert(Boolean, String)
- System.Diagnostics.Debug.Assert(Boolean, String, String)
- System.Diagnostics.Debug.Assert(Boolean, String, String, Object[])
- System.Diagnostics.Debug.WriteIf(Boolean, String)
- System.Diagnostics.Debug.WriteIf(Boolean, String, String)
- System.Diagnostics.Debug.WriteIf(Boolean, Object, String)
- System.Diagnostics.Debug.WriteLineIf(Boolean, String)
- System.Diagnostics.Debug.WriteLineIf(Boolean, String, String)
- System.Diagnostics.Debug.WriteLineIf(Boolean, Object, String)
.NET