Хм, это тяжело, так много времени, чтобы сказать так мало ...
1) Если вы можете запустить код, это сделает жизнь намного проще, точки останова (особенно условные) - ваши друзья.
2) Подход пуристов заключается в написании нескольких модульных тестов для известной функциональности, затем рефакторинга для улучшения кода и понимания, а затем повторного тестирования. Если что-то сломается, создайте больше юнит-тестов - повторяйте до тех пор, пока вам не надоест / старый / не перейдет в новый проект
3) ReSharper хорошо показывает, где что-то используется, например, что вызывает метод, это статическое, но хорошее начало, и это помогает с рефакторингом.
4) Многие события .net закодированы как общедоступные, и в лучшие времена отладка событий может быть затруднена. Перекодируйте их, чтобы они были частными и используйте свойство с добавлением / удалением. Затем вы можете использовать точку останова, чтобы увидеть, что прослушивает событие.
Кстати: я играю в .Net пространстве и хотел бы иметь инструмент, помогающий делать подобные вещи, как, например, Джоэл, кто-нибудь знает хороший инструмент для динамического просмотра кода?