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

{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);
    }
}

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



답변

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

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

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

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


답변

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

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


답변

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

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

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

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


답변