Отладка C #: [DebuggerDisplay] или ToString ()?

92

Есть два способа повысить полезность отладочной информации вместо просмотра {MyNamespace.MyProject.MyClass}в отладчике.

Это использование DebuggerDisplayAttributeи ToString()метод.

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

Есть ли причина предпочесть одно другому? Есть ли причина не делать то и другое? Это чисто личные предпочтения?

Bwerks
источник

Ответы:

94

Использование [DebuggerDisplay]предназначено только для отладчика. Переопределение ToString () имеет «побочный эффект» изменения отображения во время выполнения.

Это может быть хорошо, а может и не быть.

Часто во время отладки вам требуется больше информации, чем стандартный ToString()вывод, и в этом случае вы должны использовать и то, и другое.

Например, в вашем случае реализация ToString мне кажется странной. Я ожидал, что реализация ToString () класса «Человек» просто вернет имя напрямую, а не «Name = PersonsName». Однако во время отладки мне может понадобиться эта дополнительная информация.

Рид Копси
источник
9
+1 Чтобы добавить к точке «побочного эффекта» Рида: ToStringчасто используется как «строка отображения по умолчанию», например, с помощью Console.WriteLineпривязки данных WPF.
Стивен Клири
Конечно; формат строки был дан просто для наглядного примера, чтобы подчеркнуть его сходство со строкой, заданной для DebuggerDisplay. Формат DebuggerDisplay также может возвращать имя напрямую, как вы говорите. Я понимаю вашу точку зрения о побочных эффектах - это то различие, которое я ищу. Обычно я не часто использую метод ToString в классах (за исключением цели, которую я указал выше), поэтому другие его применения были для меня не столь очевидны. Благодарность!
bwerks 07
5

«Когда вы создаете собственный класс или структуру, вы должны переопределить метод ToString, чтобы предоставить информацию о вашем типе клиентскому коду». - MSDN

Если то, что ToString()возвращается, и вы видите в отладчике, не то, что вам нужно, используйте DebuggerDisplayAttribute.

Петр Перак
источник
4

Также можно учесть медлительность отладчика:

DebuggerDisplayAttributeВыражение формата интерпретируется отладчиком после каждого шага отладки / точки останова.

ToStringбудет собран в вашем коде , и поэтому гораздо быстрее выполнить отладчик.

То же самое и с условными точками останова: если условное выражение слишком медленно интерпретируется отладчиком каждый раз, когда выполнение достигает точки останова, может быть полезно удалить точку останова и вместо этого добавить временный код, подобный этому: if (condition) Debugger.Break();

Wizou
источник