| |||||||||
![]() |
| ||||||||
| | Функция Split и метод Split, или грабли для VB-программистадата добавления: 31 октября 2008 / 08:42, просмотров: 6875, комментариев: 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#. | |||||
| Copyright © Aleksey S Nemiro, 2007-2010 Россия, Владивосток | ||||
Комментарии (всего: 1)
Пишу на VB. Option Strict всегда держу включённым :)
Добавить комментарий