В VB6 мне сказали, что при тестировании пустой строки было бы намного быстрее проверить это, проверив длину строки, используя:
If Len("ABC") = 0 then 'fast
или же
If LenB("ABC") = 0 then 'even faster
вместо:
If "ABC" = "" then 'slower
Вы случайно не знаете, верно ли это и для VB.NET? Спасибо.





Вам следует использовать:
If ("Value").Length > 0 Then
End If
Я не совсем понимаю синтаксис для VB, но в C# вы можете использовать статический метод String IsNullOrEmpty:
String.IsNullOrEmpty("ABC")
Когда вы отлаживаете этот метод, он проверяет длину параметра. Проверка длины всегда выполняется быстрее, потому что при сравнении строк компилятор должен создать новый объект для сравнения (в данном случае строку «ABC»).
Нет. Если вы отлаживаете эту функцию, вы увидите, что .NET Framework использует .length вместо сравнения с пустой строкой.
На самом деле не имеет значения, использует ли он длину: MS может изменить эту реализацию в будущем патче. Что еще более важно, это метод верный для проведения теста. Время от времени это может быть немного медленнее, но я серьезно сомневаюсь, что проверка пустых строк является узким местом в вашем приложении.
скажем, строка нулевая - будет ли проверка только длины вызывать исключение? Если да, то, наверное, безопаснее использовать String.IsNullOrEmpty.
Выполнение str.Length, когда str равно Nothing, вызовет ошибку. Функция IsNullOrEmpty - правильный способ сделать это.
Проблема скорости значительно перевешивается удобочитаемостью. Подобные виды оптимизации - редкие исключения - пустая трата времени. Даже если один из способов окажется немного быстрее, это может измениться в будущих версиях компилятора. Это не является частью контракта между компилятором и разработчиком.
В этом нет необходимости, я имею в виду, ты издеваешься надо мной? Сколько людей пишут программы, в которых сравнение строки, чтобы увидеть, имеет ли она нулевую длину, вообще влияет на производительность. Даже если строки не сохранили счетчик длины и VB каждый раз выполнял сравнение строк strcmp () в стиле c, функции сравнения строк не требуется много времени, чтобы определить, что одна из строк имеет нулевую длину, не так ли? Но строки .NET включают поле длины, и поэтому, когда вы выполняете сравнение строк, первое, что он проверяет, - отличается ли длина, то есть прямое сравнение int. Все, что вы сохраните, сделав это самостоятельно, если вызов функции, и только если JIT встроит Len ().
Кстати, в VB.NET вам не нужно вызывать String.IsNullOrEmpty (), потому что сравнения между строками преобразуются в вызов String.strcmp (), который преобразует нули (Nothing в VB) в ссылки на String.EmptyString. Затем он вызывает собственную функцию, которую Reflector не может исследовать, но я был бы уверен, что первое, что он делает, это проверяет, различаются ли длины строк.
Я с вами. Подобные преждевременные оптимизации глупы. Я бы даже не подумал о том, чтобы сделать что-то подобное, если бы вы не были в чрезвычайно критичном ко времени приложении, которое миллионы раз выполняет проверку пустой строки. Даже тогда это под вопросом.
Я думаю, что лучшим решением для VB6, эквивалентного IsNullOrEmpty, является
Public Function IsNullOrEmpty(ByRef s As Variant) As Boolean
If IsNull(s) Then ' IsNull returns true if s is a Variant that is Null
IsNullOrEmpty = True ' IsNull returns false if s is a Variant and s = vbEmpty
Exit Function
End If
If LenB(s) = 0 Then ' never compare a string to "" - it's slow
IsNullOrEmpty = True
Exit Function
End If
If LenB(Trim(s)) = 0 Then
IsNullOrEmpty = True
Exit Function
End If
IsNullOrEmpty = False
End Function
По иронии судьбы, если у вас есть строки или вариант, для которых установлено значение vbEmpty, тогда эта функция вернет false, потому что vbEmpty as string имеет значение «0». Поэтому, если вы не будете осторожны при использовании этой версии, вы можете получить некоторые странные ошибки.
Вы хотите сказать, что IsNullOrEmpty быстрее, чем .length?