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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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