Пример, где атрибут [DebuggerDisplay (...)] полезен? - PullRequest
2 голосов
/ 13 сентября 2010

Я ищу хороший конкретный пример, где явно желательно переопределить ToString() чем-то, но использовать пользовательский атрибут [DebuggerDisplay(...)] для отображения чего-то еще в отладчике?

Ответы [ 4 ]

7 голосов
/ 13 сентября 2010

Скажем, например, объект Node для двоичного дерева.

ToString() просто хотел бы отобразить полезную нагрузку для этого узла, тогда как DebuggerDisplay, вероятно, также покажет, на какие узлы он указывает.

2 голосов
/ 14 сентября 2010

Также можно добавить, что ToString () не оценивается отладчиком в VB.NET. Так что, если вы планируете разработку с несколькими языками, хорошая идея - привыкнуть к этим атрибутам. На странице MSDN указано: https://msdn.microsoft.com/en-us/library/x810d419.aspx

Оценивает ли отладчик этот неявный вызов ToString (), зависит от настроек пользователя в диалоговом окне «Инструменты / Параметры / Отладка». Visual Basic не реализует эту неявную оценку ToString ().

Я предпочитаю использовать этот атрибут над ToString, потому что предположим, что мне не нужно использовать метод ToString () для чего-то еще, мне не нравится идея, что метод будет сидеть там даром.

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

1 голос
/ 14 сентября 2010

Ленивый в .NET4 использует его для отображения важных свойств в отладке:

[Serializable, 
DebuggerDisplay("ThreadSafetyMode={Mode}, IsValueCreated={IsValueCreated}, IsValueFaulted={IsValueFaulted}, Value={ValueForDebugDisplay}"), 
DebuggerTypeProxy(typeof(System_LazyDebugView<>)), ComVisible(false), HostProtection(SecurityAction.LinkDemand, Synchronization=true, ExternalThreading=true)]
public class Lazy<T>
{
...
}

ArrayList также используйте:

    [Serializable, ComVisible(true), DebuggerTypeProxy(typeof(ArrayListDebugView)), 
DebuggerDisplay("Count = {Count}")]
    public class ArrayList : IList, ICollection, IEnumerable, ICloneable
    {
    ...
    }

Или Цветовая структура :

    [Serializable, StructLayout(LayoutKind.Sequential), TypeConverter(typeof(ColorConverter)), 
DebuggerDisplay("{NameAndARGBValue}"), 
Editor("System.Drawing.Design.ColorEditor, System.Drawing.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
    public struct Color
    {
    ...
    }

Это можно увидеть с помощью инструмента .NET Reflector .

1 голос
/ 13 сентября 2010

Предположим, у вас есть существующее приложение, в котором .ToString () должен, скажем, сериализовать объект в строку. Не то чтобы это была хорошая идея, но предположим, что вы находитесь в такой ситуации. После этого вы могли бы по-прежнему использовать [DebuggerDisplay (...)], чтобы упростить свою жизнь, не изменяя этот (по общему признанию плохой, но я подозреваю, что это необычно) контракт между классом и остальной частью приложения.

...