Когда приходится просматривать элементы списка (массива) в отладчике Visual Studio, например, в окне QuickWatch часто сталкивашься с не удобством просмотра сложного (или длинного) списка данных. Тяжело увидеть, например, значения поля всех элементов списка.
Данный пост показывает несколько «встроенных» способов решения этой проблемы и возможности расширения BugAid.
мало букв, но достаточно картинок.
Рассмотрим простейший пример.
<source lang="cs">
public class DataItem
{
public string Name { get; private set; }
public string Description { get; private set; }
public DataItem(string name, string description)
{
Name = name;
Description = description;
}
}
public class DataItems
{
public List<DataItem> Items { get; private set; }
public DataItems()
{
Items = new List<DataItem>();
}
}
</source>
Теперь, просматривая данные в отладчике мы видим примерно так:
Стандартный QuickWatch не позволяет нам увидеть определенное поле (или отформатированные поля) сразу для всех элементов списка.
Для решения этой задачи многим разработчикам известен прямолинейный способ реализиции метода ToString():
<source lang="cs">
public class DataItem
{
public string Name { get; private set; }
public string Description { get; private set; }
public DataItem(string name, string description)
{
Name = name;
Description = description;
}
public override string ToString()
{
return String.Format("{0}: {1}", Name, Description);
}
}
</source>
или более «атрибутный» способ: public DataItem(string name, string description)
<source lang="cs">
[DebuggerDisplay("Name = {Name}, Desciption = {Description}")]
public class DataItem
{
public string Name { get; private set; }
public string Description { get; private set; }
{
Name = name;
Description = description;
}
}
</source>
надо заметить, что для более сложных задач существует аттрибут DebuggerTypeProxy, но и он не предел :).
Эти два способа хороши, но есть у них тот недостаток, что все это должно быть написано в коде программы и откомпилировано. А ведь часто нужно рассматривать данные списка в разных форматах. Останавливать для этого отладчик, менять код или аттрибут, перекомпилировать и запускать заново — это очень трудоемкий способ.
Как оказалось, существует расширение BugAid для Visual Studio (как минимум c VS2010), которое решает эту задачу, а заодно и еще некоторые другие.
После установки этого расширения, появляется меню BugAid с пару опциями и собственным окном «BugAid — QuickWatch».
Теперь можно с помощью звездочки выбрать поля, которые необходимо смотреть для всех элементов списка
и вуаля
но это еще не все. даже скорее, все этим только начинается.
а ведь хочется замутить какой-нибудь формат для данных и показывать что-нибудь этакое. В этом случае можно воспользоваться "Add Custom Expression", добавить выражение для элемента списка: что то типа "[obj].Name.Length"
и «наслаждаться» кастомным форматом данных без компиляции и «контрибуции»:
а как часто хотелось бы гуглом поискать какие-нибудь данные в сложном списке?
так вот вбиваеам в поле Search то что хочется найти и получаем:
а вот сравнить бы пару элементов списка между собой.
можно и это: выбирается первый элемент через меню "Select Left Side For Compare", а затем второй — "Compare to ..." и смотрим разницу:
ну тогда бы еще хорошо бы и пофильтровать данные:
кроме этого, можно сохранять элементы и сравнивать элементы во времени.
Расширение BugAid имеет еще несколько интересных возможностей (например, для визуализации сложных выражений в операторе if).
так что я думаю, это расширение заслуживает внимание разработчиков.
пару слов о недостатках, которые я обнаружил.
- Это еще не релиз, а бета, так что не всегда работает стабильно. Чем сложнее структуры данных, там увеличивается вероятность всяких проблем.
- Некоторый стандартный функционал (например аттрибут DebuggerTypeProxy) не поддержан расширением.
- Расширение не бесплатно, но есть двухмесячный бесплатный период использования.
Кстати, сайт поддержки http://bugaidsoftware.userecho.com/ довольно удобен и уважает gamification, что в данном случае скорее хорошо, чем нет.
спасибо,
Игорь.
Автор: constructor