Дизайнер отладки, обрабатывающий в VS 2008 - PullRequest
2 голосов
/ 21 сентября 2008

В моей форме установлено публичное свойство типа ListE<T>, где:

public class ListE<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable

Да, это глоток, но это то, что требует от дизайнера, чтобы он отображался как редактируемая коллекция в окне свойств. Что это делает! Итак, я нажимаю маленькую кнопку [..], чтобы редактировать коллекцию, а затем нажимаю кнопку Добавить, чтобы добавить элемент в коллекцию.

Арифметическая операция привела к переполнению.

Теперь это очень простой список, немного больше, чем расширяющийся массив. Единственная часть, которая приближается к арифметике в целом, находится в функции расширения, и даже она использует сдвиг влево, а не умножение, чтобы не переполняться. Все это заставляет меня думать, что это исключение возникает в Designer, возможно, из-за небольшого невнимания к деталям реализации с моей стороны, но я не могу найти способ протестировать или отладить этот сценарий. У кого-нибудь есть какие-нибудь умные идеи?

РЕДАКТИРОВАТЬ: Да, я могу успешно использовать свойство, хорошо, даже вручную, т.е. в обработчике OnLoad, и я полагаю, что к этому я должен прибегнуть, если я не смогу заставить это работать, но это не было бы идеально. (

Ответы [ 3 ]

3 голосов
/ 21 сентября 2008

Я не могу понять, что побуждает вас пытаться изобретать колесо List таким образом, но чтобы ответить на ваш вопрос: я бы добавил строку "System.Diagnostics.Debugger.Break ()" в конструктор вашего класса.

Затем попробуйте использовать его в конструкторе, и вы получите всплывающее окно с вопросом, хотите ли вы подключить отладчик. Подключите второй экземпляр Visual Studio в качестве отладчика, и вы сможете установить некоторые точки останова в своем коде и начать отладку.

0 голосов
/ 24 сентября 2008

Вам не нужно добавлять Debugger.Break (); вызовите ваш код, чтобы отладить его. Вы можете просто открыть другой экземпляр VS и присоединить к тому, в котором вы его используете, и вы сможете отладить его без проблем (просто убедитесь, что у вас загружены символы).

0 голосов
/ 21 сентября 2008

Для начала можно было бы заняться математикой со свойством ListE`1 :: Count. Если у этого есть некоторый тонкий недостаток (то есть это более сложно, чем возвращать this.innerList.Count), это может привести к арифметическому переполнению конструктора при какой-либо операции. Как правило, арифметические переполнения не происходят, если специально не просят использовать

checked
{
   // ...
}

синтаксис.

...