Данный пост показывает несколько «встроенных» способов решения этой проблемы и возможности расширения 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>
или более «атрибутный» способ:
<source lang="cs"> [DebuggerDisplay("Name = {Name}, Desciption = {Description}")] 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; } } </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, что в данном случае скорее хорошо, чем нет.
спасибо,
Игорь.
ссылка на оригинал статьи http://habrahabr.ru/post/181604/
Добавить комментарий