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

Есть два способа повысить полезность отладочной информации вместо просмотра {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);
    }
}

Есть ли причина отдавать предпочтение одному? Любая причина не делать оба? Это чисто личное предпочтение?

7 ответов

Решение

С помощью [DebuggerDisplay] предназначен только для отладчика. Переопределение ToString() имеет "побочный эффект" изменения отображения во время выполнения.

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

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

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

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

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

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

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

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

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

Личные предпочтения (когда желаемый результат на самом деле не известен на 100%)

  1. Реализовать вспомогательную функцию
  2. Реализовать ToString с точки зрения HelperFunction
  3. Реализуйте DebuggerDisplay с точки зрения HelperFunction.

Теперь будущие правки могут либо различаться, либо оставаться согласованными по мере необходимости, а также обеспечивается лучшая отслеживаемость.

DebuggerDisplayбыстрее набрать что-то простое.

может быть намного сложнее, если данные, которые вы хотите просмотреть, зависят от свойств объекта. Комбинировать с #if DEBUGоператор, и у вас будет хорошее средство просмотра данных только для DEBUG. Буквально никто не использует «как есть» для «представления клиента», потому что это слишком расплывчато, и любые изменения было бы невозможно поддерживать логически. Все всегда вызывают явные свойства или методы вместо ToString(), за исключением случаев, когда предоставление этой строки является единственной целью класса и то же самое и при отладке.

Также есть DebuggerBrowsableAttribute и DebuggerTypeProxyAttribute, но они просто добавляют сложности, если в этом нет реальной необходимости.

Если вы используете Xamarin для разработки для Android, метод ToString не будет отображаться в окне просмотра, но DebuggerDisplay будет.

довольно ограничен в том, что он может делать. У вас есть только строка формата, которую вы можете использовать для отображения значений определенных членов.

Если вы хотите отображать данные условно, данные с нескольких уровней или агрегированные данные, может быть вашим единственным вариантом.

Другие вопросы по тегам