Почему моя коллекция решает начать с 0 вместо 1? - PullRequest
2 голосов
/ 15 апреля 2009

У меня проблема с тем, что к коллекции объектов обращаются неправильно при запуске в потоке из службы. Я могу нормально запустить свои модульные тесты в VS2008, но когда я присоединяю отладчик к сервису, я ясно вижу, что он начинается не с индекса на основе 1, а с индекса на основе 0. Я перепробовал все, что мог придумать, чтобы изолировать это, и единственное отличие состоит в том, что он находится в службе и не работает, например, как приложение командной строки.

Когда я отлаживаю функцию, я также получаю сообщение «сбой оценки свойства», чего не происходит, когда я запускаю ее в модульном тесте.

Пожалуйста, сообщите.

[EDIT]

Я знаю, что массивы обычно начинаются с 0. Я всегда предполагал это, но сегодня я обнаружил эту ошибку и определил, что, хотя я думал, что она началась с 0, отладчик показывает, что она начинается с 1. Когда я итерация через коллекцию он получает правильное значение в VS, но не в сервисе.

[РЕДАКТИРОВАТЬ]

Я использую Microsoft.VisualBasic.Collection, потому что я могу поставить против нее ключ. Можно также использовать объект словаря, но теперь он настроен таким образом, и именно так мои классы BLL Base и другие многочисленные функции читают его, поэтому изменять его не желательно.

[РЕШЕНИЕ]

Я произвел рефакторинг своего кода, используя dicitonary и Generic.KeyValuePair (Of String, Object), чтобы мне не пришлось переписывать код, который обращается к ключам. Теперь должно работать нормально, так как он не обрабатывает коллекции так же, как объект Collecitons.

Ответы [ 2 ]

4 голосов
/ 15 апреля 2009

По умолчанию языки .NET начинаются с индекса массива 0, за исключением случаев, когда вы явно указываете начало с 1 для VB.NET.

Я не верю, что есть способ обеспечить соблюдение этого соглашения о массивах вне сборок VB, и поэтому, когда они проходят через удаленное взаимодействие Windows или веб-сервисы, они возвращаются обратно к соглашению об индексах на основе 0.

Ради вашего здравого смысла я рекомендую вам реорганизовать весь код, чтобы вместо него использовать 0-индексированные коллекции и массивы.

Обновление

На основании ваших комментариев вы сказали, что использовали объект Microsoft.VisualBasic.Collection. Объект Microsoft.VisualBasic.Collection использует 1 в качестве начального индекса. Вместо этого используйте объект ArrayList или, что еще лучше, универсальный объект List.

2 голосов
/ 15 апреля 2009

Все коллекции в .NET Framework начинаются с 0, как и массивы. Всегда.

Из ваших комментариев вы используете особый тип коллекции Visual Basic. Я рекомендую вам избавиться от этой привычки, так как я считаю, что этот тип предназначен для взаимодействия с VB6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...