Как заставить ToString() отображаться в отладке

Я хотел бы, чтобы ToString() отображался для класса, находящегося под моим контролем, в режиме отладки.

Было бы неплохо, если бы это первое, что появлялось при наведении мыши на переменную. Есть ли атрибут для этого?


person sgtz    schedule 26.07.2011    source источник
comment
Спасибо всем. Очень удобно.   -  person sgtz    schedule 26.07.2011
comment
возможно, Инструменты / Параметры / Отладка / Включить оценку свойств и другие неявные вызовы функций + Вызов функции преобразования строк для объектов в окнах переменных.   -  person ToolmakerSteve    schedule 16.11.2018
comment
Что-то еще, чтобы проверить, если ваш метод ToString выдает исключение, локальные отладки не будут его использовать (если только вы не заставите его использовать атрибуты класса в ответах ниже).   -  person Elaskanator    schedule 24.01.2019


Ответы (7)


Отметьте свой класс с помощью

[System.Diagnostics.DebuggerDisplay("{ToString()}")]

Тест:

[System.Diagnostics.DebuggerDisplay("{ToString()}")]
class MyClass
{
    private string _foo = "This is the text that will be displayed at debugging"

    public override string ToString()
    {
        return _foo;
    }
}

Теперь, когда вы наводите указатель мыши на переменную, она показывает This is the text that will be displayed at debugging.

person Jalal Said    schedule 26.07.2011

Существует DebuggerDisplayAttribute, который позволяет вам влиять на отображение. Он позволяет писать довольно сложные выражения для получения отладочного вывода, хотя не рекомендуется сделать это.

Однако, если вы переопределили ToString, отладчик задокументирован, чтобы отображать это по умолчанию. Может быть, что-то не так с кодом?

person Jon    schedule 26.07.2011
comment
Извините, я нажал не ту кнопку редактирования, и мой возврат наложился на ваше второе редактирование :( - person Zebi; 26.07.2011
comment
@Zebi: откатился назад, не беспокойтесь. - person Jon; 26.07.2011
comment
+1 не уверен, что они имели в виду под неявным доступом, но я буду помнить об этих проблемах с производительностью. Если выражение ссылается на свойства, атрибуты этих свойств не обрабатываются, и это, вероятно, самая большая проблема для меня. - person sgtz; 26.07.2011
comment
@sgtz: они означают, что this доступен для использования в выражении (имеет доступ), и вам не нужно его вводить (неявно). В основном именно то, что происходит с this, например. внутри метода класса. - person Jon; 26.07.2011
comment
Если ToString() выдает исключение, отладчик VS не будет отображать значение. DebuggerDisplayAttribute принудительно отобразит сообщение об исключении. Но обычно вам не нужно этого делать. - person swdev; 03.10.2015
comment
Знаете ли вы, почему отладчик перестает показывать toString() моей коллекции, когда я случайно добавляю более двух элементов? - person Eduardo Hernández; 07.11.2016

Вывод ToString должен быть значением по умолчанию, которое вы видите при отладке.

Его можно переопределить с помощью атрибута DebuggerDisplay (см. MSDN).

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

Какой выход вы видите? Если вы получите имя типа, вы увидите значение по умолчанию ToString.

person Zebi    schedule 26.07.2011
comment
+1. ты. ToString кажется естественным местом для него в большинстве случаев. - person sgtz; 26.07.2011

То, что вы ищете, это DebuggerDisplayAttribute:

http://www.codeproject.com/Articles/117477/Using-DebuggerDisplayAttribute

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

person Adam Houldsworth    schedule 26.07.2011
comment
+1 может принять только один ответ, но эта ссылка дает мне непосредственный пример того, что возможно. - person sgtz; 26.07.2011

У меня была аналогичная проблема. В моем классе было переопределение ToString(), и оно все еще не отображалось в VS, что было странно.

Добавление атрибута [System.Diagnostics.DebuggerDisplay("{ToString()}")] в класс показало исключение в отладчике Visual Studio, где должен был отображаться ToString. Оказалось, у меня была ошибка с неправильным использованием string.Format() в моей реализации. Это интересное поведение — VS возвращается к ToString по умолчанию в случае исключения. Использование упомянутого атрибута заставляет дисплей отображать выходные данные метода - действительные или исключительные. Это очень полезно для отладки ToString(). В противном случае нет смысла явно добавлять этот атрибут к каждому классу, поскольку классы включают его по умолчанию, если только кто-то не хочет отключить это поведение по какой-либо причине.

person BigMan73    schedule 19.07.2017

в объекте Переопределите .ToString следующим образом:

public class MyObject
{
        public int Property1{ get; set; }
        public string Property2{ get; set; }
        public string Property3 { get; set; }

        public override string ToString()
        {
            return Property3;
        }
}

Это вернет Property3 как значение ToString().

person stack72    schedule 26.07.2011

Если вы используете визуальную студию, вы можете добавить watch @ runtime в строку yourvariable.ToString(), это будет отображаться в нижней части экрана при достижении точки останова.

person Thomas    schedule 26.07.2011
comment
Хотя добавление переменной наблюдения служит своей цели, оно не отвечает на вопрос. Вопрос заключался в том, как заставить вашу переменную отображать всплывающую подсказку, когда вы наводите на нее курсор в режиме отладки. - person John C; 15.10.2012