Разница между + и & для объединения строк в VB.NET - PullRequest
64 голосов
/ 09 апреля 2009

В чем разница между + и & для объединения строк в VB.NET?

Ответы [ 8 ]

83 голосов
/ 09 апреля 2009

Нет разницы, если оба операнда являются строками. Однако, если один операнд является строкой, а один - числом, вы столкнетесь с проблемами, см. Код ниже.

"abc" + "def" = "abcdef"
"abc" & "def" = "abcdef"
"111" + "222" = "111222"
"111" & "222" = "111222"
"111" & 222 = "111222"
"111" + 222 = 333
"abc" + 222 = conversion error

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

13 голосов
/ 09 апреля 2009

Оператор & всегда гарантирует, что оба операнда являются строками, а оператор + находит перегрузку, соответствующую операндам.

Выражение 1 & 2 дает значение «12», в то время как выражение 1 + 2 дает значение 3.

Если оба операнда являются строками, в результате нет разницы.

7 голосов
/ 13 сентября 2010

Отсутствует.

Как вы можете видеть ниже. Эти две строки кода компилируются точно в один и тот же код IL:

Module Module1

Sub Main()
    Dim s1 As String = "s1"
    Dim s2 As String = "s2"
    s2 += s1
    s1 &= s2
End Sub

End Module

Компилируется в (примечание System.String::Concat):

.method public static void  Main() cil managed
{
.entrypoint
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 ) 
// Code size       31 (0x1f)
.maxstack  2
.locals init ([0] string s1,
       [1] string s2)
IL_0000:  nop
IL_0001:  ldstr      "s1"
IL_0006:  stloc.0
IL_0007:  ldstr      "s2"
IL_000c:  stloc.1
IL_000d:  ldloc.1
IL_000e:  ldloc.0
IL_000f:  call       string [mscorlib]System.String::Concat(string,
                                                          string)
IL_0014:  stloc.1
IL_0015:  ldloc.0
IL_0016:  ldloc.1
IL_0017:  call       string [mscorlib]System.String::Concat(string,
                                                          string)
IL_001c:  stloc.0
IL_001d:  nop
IL_001e:  ret
} // end of method Module1::Main
3 голосов
/ 09 апреля 2009

Оператор + может быть либо сложением, либо конкатенацией. & Является только конкатенацией. Если оба выражения являются строками, результаты будут одинаковыми.

Я использую & при работе со строками и + при работе с числами, так что мои намерения никогда не путаются. Если вы по ошибке используете +, а одно выражение является строкой, а одно - числом, вы рискуете получить нежелательные результаты.

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

Нет разницы в большинстве случаев. Тем не менее, лучшая практика:

"+" должно быть зарезервировано для целочисленных дополнений , потому что, если вы не используете Option Strict On , то вы могли действительно испортить ситуации, такие как:

Input + 12 может дать вам 20 вместо 812. Это может быть особенно плохо в приложении ASP.NET, где ввод поступает из POST / GET.

Проще говоря: Для объединения строк всегда используйте «&» вместо «+».

Очевидно, используйте StringBuilder , где это подходит:)

1 голос
/ 05 мая 2016

Прямо из документации MSDN: Операторы конкатенации в Visual Basic

Различия между двумя операторами конкатенации

Оператор + (Visual Basic) предназначен для добавления двух номера. Тем не менее, он также может объединять числовые операнды со строкой операнды. Оператор + имеет сложный набор правил, которые определяют добавлять, объединять, сигнализировать об ошибке компилятора или выдавать исключение InvalidCastException во время выполнения.

Оператор & (Visual Basic) определен только для строковых операндов, и он всегда расширяет свои операнды до String, независимо от настройки Вариант Строгий. Оператор & рекомендуется для объединения строк потому что он определен исключительно для строк и снижает ваши шансы генерации непреднамеренного преобразования.

Доверяйте MSDN! : -)

1 голос
/ 09 апреля 2009

Если оба типа статически типизированы как System.String , разница между кодами равна нулю. И то и другое разрешается до элемента String.Concat (это то, что + делает для строк).

Однако, если объекты строго не типизированы в строку, поздняя привязка Visual Basic вступит в действие и пойдет двумя совершенно разными путями. Версия + попытается выполнить операцию add , которая буквально пытается добавить объекты. Это будет делать все попытки преобразовать оба значения в число и затем добавить их.

Оператор & попытается объединить. Среда выполнения Visual Basic пройдет все виды преобразований, чтобы преобразовать оба значения в строки. Затем String.Concat результаты.

0 голосов
/ 09 апреля 2009

Нет при соединении строк:

    Dim string1 As String = "A" + "B"
    Dim string2 As String = "A" & "B"

    If string1.Equals(string2) And string2.Equals(string1) Then
        Debugger.Break()
    End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...