Отладка в C #: [DebuggerDisplay] или ToString ()? - PullRequest
76 голосов
/ 07 июля 2010

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

Это использование [DebuggerDisplayAttribute][1] и 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);
    }
}

Есть ли основания для предпочтения одного из нихДругой?Любая причина не делать оба?Это чисто личное предпочтение?

Ответы [ 3 ]

82 голосов
/ 07 июля 2010

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

Это может или не может быть хорошей вещью.

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

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

5 голосов
/ 30 декабря 2014

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

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

3 голосов
/ 01 марта 2018

Медлительность отладчика также может быть принята во внимание:

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

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

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

...