Функция Len() vs String.Length; который выбрать?
Я делаю переход от VB6 к VB.Net(VS 2010) и имею базовое, а не простое понимание последнего. У меня, очевидно, довольно много кода... Я смущаюсь использовать слово "upgrade", когда "порт" будет более уместным, учитывая, что мастер обновления прошлых версий VS также может просто прокомментировать код и сказал "Эй, почему бы тебе не начать с нуля?"
В одной процедуре, которую я использую для функции Len()
, используется для определения длины строковой переменной. Это все еще работает в VB.Net(хотя я полагаю, что это фактически вызов метода Strings.Len
), но другой альтернативой является просто запрос к свойству .Length
переменной.
Вопрос в том, что использовать и почему. Я просмотрел соответствующие страницы MSDN, и все, что они мне говорят, это то, что метод/свойство существует. Ничего не сказано о проблемах с производительностью, особенно когда могут быть задействованы циклы большого количества вызовов.
Итак, мой вопрос заключается в том, знает ли кто-либо о проверенных и подтвержденных преимуществах использования одного подхода по сравнению с другим, или это просто вопрос личных предпочтений. Любые указатели на аналогичные ситуации, с которыми я мог бы столкнуться, когда я делаю прогрессию, также были бы оценены, хотя, учитывая, что Qaru рекомендует эту проблему, я заинтересован в том, есть ли конкретный ответ.
Ответы
Ответ 1
Поскольку вы используете VB.NET, ваш Strings
может быть Nothing
, и если вы явно не проверите это, большинство методов VB, включая Len
, будут обрабатывать его так же, как String.Empty
, т.е. ""
.
С Reflector вы можете видеть, что Len
реализован как нулевая проверка, возвращая 0
для Nothing
и в противном случае возвращает .Length
, а JITTER, скорее всего, выполнит вызов.
Итак, если вы используете другие методы VB, я бы предложил использовать Len
, если вы не знаете, что String
не Nothing
или везде Nothing
.
Ответ 2
Итак, согласно this:
Len, другая классическая функция BASIC, возвращает длину строки. System.String имеет свойство Length, которое предоставляет ту же информацию. Лучше другого?
По производительности, эти две функции мало отличаются от 1000 итераций. Похоже, что в этом случае нет причин предпочитать один за другим, и нет функциональной разницы. Я немного частично использовал значение свойства, а не функцию VB, так как это побуждает думать о строках .NET как о объектах. Однако, по сути, это действительно только личное предпочтение.
Если вы доверяете их слову, тогда ваш ответ. В противном случае кодирование теста и повторение должны дать вам окончательный ответ.
Ответ 3
Я не уверен в специфике метода Len()
(мой язык выбора - С#), но я бы сказал, безусловно, с помощью свойства Length
. Length
является членом класса System.String
, тогда как Len()
- нет.
Я предполагаю, что Len()
- это просто прокладка VB поверх свойства Length
. Кто-то, вероятно, мог бы утверждать, что использование Len()
более идиоматично, с точки зрения VB. Я думаю, что я предпочел бы использовать свойство, встроенное в класс, а не просто использовать другой механизм только потому, что он предоставлен языком.
Ответ 4
В дополнение к сообщению @Andrew, Len() является строковой функцией из библиотеки времени выполнения Visual Basic, где Length
является свойство класса System.String
API-интерфейсов .net.
Ответ 5
Метод Len
предоставляется для обратной совместимости со старым VB6 (и более ранним) не .NET-кодом. Там нет ничего технически неправильного в использовании. Это будет работать и так же хорошо. Но лучше использовать новый способ делать вещи, когда это возможно. Тем не менее, помимо получения большего количества "умственного мышления", единственным реальным ощутимым преимуществом использования String.Length
является то, что он упрощает перенос кода на другие языки .NET в будущем.
Ответ 6
Недавно я столкнулся с проблемой с моим старым кодом VB.Net, который использовал функцию Len(). Я обновил свой проект до Core, который ссылался на старый файл DLL VB.net, и он использовал функцию Len(). Я получил ошибку совместимости во время выполнения - метод не найден: 'Int32 Microsoft.VisualBasic.Strings.Len(System.String)'
Я должен изменить все такие старые функции, которые Core устарел. Поэтому я поддерживаю String.Length над Len(), как предложил Стивен Доггарт.