Можно ли настроить значение окна просмотра списка ?

#c# #visual-studio #visual-studio-2015 #visual-studio-debugging

#c# #visual-studio #visual-studio-2015 #visual-studio-debugging

Вопрос:

Переопределение toString() класса — это обычно все, что вам нужно сделать, чтобы получить пользовательское форматирование в окне просмотра, но когда класс является производным от списка, это, похоже, не работает.

 class ListOfInts : List<int>
{
    public override string ToString()
    {
        return string.Join(",", this);
    }

    public static ListOfInts test = new ListOfInts() { 3, 4, 5 };
}
 

Проверяя «тест» в окне просмотра, я получаю

 ListOfInts.test             Count = 3   ListOfInts
 

и нужно вручную решить проблему следующим образом:

 ListOfInts.test.ToString()  "3,4,5"     string
 

Это нормально для одного списка, но у меня есть большой массив вещей. Есть ли способ остановить приоритет формата «Count = 3» по умолчанию?

Комментарии:

1. Никогда не использовался, но попробуйте DebuggerDisplay -Attribute

Ответ №1:

Вы можете использовать DebuggerDisplayAttribute :

 [DebuggerDisplay("{ToString()}")]
public class ListOfInts : List<int>
{
    public override string ToString()
    {
        return string.Join(",", this);
    }
}
 

Комментарии:

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

2. @TimSchmelter, в моей LINQPad он использует переопределенный ToString() без [DebuggerDisplay] атрибута. Однако не проверял VS.

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

4. Обратите внимание, что, вероятно, будет хорошей идеей ограничить это до некоторой степени, как в случае, когда это список<T>, где T — класс, реализация toString() которого выполняется медленно, это может вызвать нежелательные задержки (или иным образом просто перестать работать по истечении времени ожидания дляпервый раз). Что-то вроде return string.Join(",", this.Take(20)) this.Count > 20 ? "..." : ""; должно исправить