Налагодження 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);
    }
}

Чи є підстави віддавати перевагу одному перед іншим? Будь-яка причина не робити обох? Це суто особисті переваги?

Відповіді:


94

Використання [DebuggerDisplay]призначене лише для налагоджувача. Заміна ToString () має "побічний ефект" зміни дисплея під час виконання.

Це може бути, а може і не добре.

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

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


9
+1 Для додавання до точки "побічного ефекту" Ріда: ToStringчасто використовується як "рядок відображення за замовчуванням", наприклад, за допомогою Console.WriteLineабо прив'язки даних WPF.
Стівен Клірі

Звичайно; формат рядка щойно подано для наочного прикладу, щоб підкреслити його схожість із рядком, заданим для DebuggerDisplay. Формат DebuggerDisplay також може повернути назву безпосередньо, як ви говорите. Однак я бачу вашу думку щодо побічних ефектів - це така різниця, яку я шукаю. Я зазвичай не використовую метод ToString у класах (за винятком тієї мети, яку я вказав вище), тому інші звичаї для мене були не такими очевидними. Дякую!
bwerks

5

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

Якщо те, що ToString()повертається, і ви бачите в налагоджувачі, не те, що ви хотіли б, тоді ви використовуєте DebuggerDisplayAttribute.


4

Також можна взяти до уваги повільність відладчика:

DebuggerDisplayAttributeвираз формату інтерпретується налагоджувачем після кожного кроку / точки зупинки налагодження.

ToStringбуде складено в вашому коді , і тому набагато швидше виконати відладчик.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.