Рейтинг блогов

Функция Split и метод Split, или грабли для VB-программиста

дата добавления: 31 октября 2008 / 08:42, просмотров: 30540, комментариев: 1
В далекие времена (ну очень далекие), при использовании метода Split в Visual Basic .NET, я столкнулся с непонятной проблемой, когда сей метод выдавал совсем не то, что я от него ожидал. Что именно он мне выдавал, и в чем заключалась суть проблемы я уже точно не помню, давно это было :) Тогда я особо не вникал в это дело, и просто использовал одноименную функцию Split, которая делала, то, что мне было нужно. А на метод Split, я со спокойной совестью, повешал ярлык: «Осторожно, баг», да еще и пытался убедить в этом «братьев по оружию» :) Это называется, решил проблему не вникая в ее суть. 

Сегодня, совершенно случайно, поймал логический баг по этой же теме. Суть бага заключалась в том, что в коде использовался метод Split, который должен был «сплитеть» по строке, т.е.:

Dim s As String = "это пример<сплит>раз два<сплит>три"
Dim a() As String = s.Split("<сплит>")


По задумке, в результате выполнения данного кода, переменная a() должна содержать строки:

a(0) = "это пример"
a(1) = "раз два"
a(2) = "три"

Однако, метод Split в качестве параметра ждет массив символов, но не строку! Если дать ему строку, то используется только первый символ из этой строки, и результатом выполнения выше указанного кода будет:

a(0) = "это пример"
a(1) = "сплит>раз два"
a(2) = "сплит>три"

Казалось бы, мелочь, но эта мелочь в больших проектах может стать довольно серьезной проблемой. Мне, например, пришлось несколько брейкпоинтов потратить, чтобы добраться до этого «зверя».

В данном случае, использование VB-функции Split даст желаемый результат:

Dim s As String = "это пример<сплит>раз два<сплит>три"
Dim a() As String = Split(s, "<сплит>")
'a(0) = "это пример"
'a(1) = "раз два"
'a(2) = "три"

Или же можно использовать функцию Split класса Regex:

Dim a() As String = Regex.Split(s, "\<сплит\>")

Тем, кто работает с C#, подобный баг не грозит, и может даже показаться смешным, ибо в шарпе все очевидно и компилятор не позволит засовывать в метод Split тип данных String. Ну а Бэйски, Бэйсик как всегда молчит, зачем зря хозяина по пустякам беспокоить :) Хотя его можно вразумить, включив опцию Option Strict On, но, имхо, тогда уж лучше C#.

Комментарии (всего: 1)

Добавить комментарий rss
Автор: Aerelornee @ 06 декабря 2008, 00:14   ·   ссылка
Хотя его можно вразумить, включив опцию Option Strict On, но, имхо, тогда уж лучше C#.

Пишу на VB. Option Strict всегда держу включённым :)

Добавить комментарий

Добавлять комментарии могут только зарегистрированные пользователи сайта.
Если у Вас уже есть учётная запись на этом сайте, пройдите процудуру авторизации.
В противном случае, зарегистрируйтесь на сайте.