Отладка дизайнерской обработки в VS 2008
-
02-07-2019 - |
Вопрос
У меня есть общедоступное свойство, установленное в моей форме типа ListE<T>
где:
public class ListE<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable
Да, это сложный процесс, но это то, что требуется дизайнеру, чтобы он отображался как редактируемая коллекция в окне Свойств.Что он и делает!Итак, я нажимаю маленькую кнопку [..], чтобы отредактировать коллекцию, а затем нажимаю Добавить, чтобы добавить элемент в коллекцию.
Арифметическая операция привела к переполнению.
Итак, это очень простой список, немногим больше, чем расширяющийся массив.Единственная часть, которая во всем этом близка к арифметике, - это функция expand , и даже она использует сдвиг влево, а не умножение, так что переполнения не будет.Все это заставляет меня думать, что это исключение возникает внутри конструктора, возможно, вызванное небольшим невниманием к деталям реализации с моей стороны, но я не могу найти способ протестировать или отладить этот сценарий.У кого-нибудь есть какие-нибудь умные идеи?
Редактировать:Да, я могу успешно использовать свойство, ну даже вручную, т.е.в OnLoad
обработчик, и я полагаю, что именно к этому мне придется прибегнуть, если я не смогу заставить это работать, но это было бы не идеально.:(
Решение
Я не могу понять, что побуждает вас пытаться изобрести колесо списка<T> таким образом, но чтобы ответить на ваш вопрос:Я бы добавил строку "System.Diagnostics.Debugger.Break()" в конструктор вашего класса.
Затем попробуйте использовать его в конструкторе, и вы получите всплывающее окно с вопросом, хотите ли вы подключить отладчик.Подключите второй экземпляр Visual Studio в качестве отладчика, и вы сможете установить некоторые точки останова в своем коде и начать отладку.
Другие советы
Одним из мест, с которого можно начать, было бы то, что он может выполнять математические вычисления с вашим свойством ListE`1::Count.Если в этом есть какой-то тонкий изъян (т. е.это сложнее, чем return this.innerList.Count) это может быть причиной арифметического переполнения конструктора при какой-либо операции.Обычно арифметические переполнения не происходят, если только специально не запрашивается использование
checked
{
// ...
}
синтаксис.
Вам не нужно добавлять отладчик.Break();вызовите свой код, чтобы отладить его.Вы можете просто открыть другой экземпляр VS и подключиться к тому, в котором вы его используете, и вы сможете отладить его без проблем (просто убедитесь, что у вас загружены символы).