C # 디버깅 : [DebuggerDisplay] 또는 ToString ()?


92

{MyNamespace.MyProject.MyClass}디버거에서 보는 대신 디버깅 정보의 유용성을 높이는 두 가지 방법이 있습니다 .

이것들은 사용 DebuggerDisplayAttributeToString()방법입니다.

using System.Diagnostics;
...

[DebuggerDisplay("Name = {Name}")]
public class Person
{
    public string Name;
}

또는

public class Person
{
    public string Name;
    public override string ToString()
    {
        return string.Format("Name = {0}", Name);
    }
}

하나를 선호하는 이유가 있습니까? 둘 다하지 않을 이유가 있습니까? 순전히 개인적인 취향입니까?

답변:


94

사용 [DebuggerDisplay]은 디버거 전용입니다. ToString ()을 재정의하면 런타임에 디스플레이를 변경하는 "부작용"이 있습니다.

이것은 좋은 것일 수도 있고 아닐 수도 있습니다.

종종 표준 ToString()출력 보다 디버깅 중에 더 많은 정보를 원 하며,이 경우 둘 다 사용합니다.

예를 들어, 귀하의 경우 "ToString"구현이 이상하게 보입니다. "Person"클래스 ToString () 구현이 "Name = PersonsName"이 아닌 Name을 직접 반환 할 것으로 예상합니다. 그러나 디버깅 중에 추가 정보가 필요할 수 있습니다.


9
+1 Reed의 "부작용"지점에 추가하려면 : ToString는 종종 "기본 표시 문자열"로 사용됩니다 (예 : by Console.WriteLine또는 WPF 데이터 바인딩).
Stephen Cleary

확실한; 문자열의 형식은 DebuggerDisplay에 제공된 문자열과의 유사성을 강조하기 위해 시각적 예제로 제공되었습니다. DebuggerDisplay 형식은 말했듯이 이름을 직접 반환 할 수도 있습니다. 나는 부작용에 대한 당신의 요점을 봅니다. 그것은 제가 찾고있는 종류의 구별입니다. 나는 일반적으로 클래스에서 ToString 메서드를 많이 사용하지 않으므로 (위에 주어진 목적을 제외하고) 다른 사용법이 나에게 분명하지 않았습니다. 감사!
bwerks 2010-07-07

5

"사용자 정의 클래스 또는 구조체를 만들 때 클라이언트 코드에 유형에 대한 정보를 제공하려면 ToString 메서드를 재정의해야합니다." — MSDN

무슨 일이있는 경우 ToString()반환하고 디버거에서 볼 당신이 다음하고 싶은 당신이 무엇을 사용하지 않습니다 DebuggerDisplayAttribute.


4

디버거의 속도 저하도 고려할 수 있습니다.

DebuggerDisplayAttribute형식 표현식은 각 디버깅 단계 / 중단 점 후에 디버거에 의해 해석 됩니다.

ToString되어 컴파일 된 코드에 따라서 훨씬 빠르게 디버거에서 실행하는 것입니다.

조건부 중단 점에서도 마찬가지입니다. 조건식이 너무 느려서 실행이 중단 점에 도달 할 때마다 디버거에서 해석 할 수없는 경우 중단 점을 제거하고 대신 다음과 같은 임시 코드를 추가하는 것이 유용 할 수 있습니다. if (condition) Debugger.Break();

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.