Разница между + и & для соединения строк в VB.NET


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

8 56

8 ответов:

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

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

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

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

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

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

нет.

как вы можете видеть ниже. Эти две строки кода компилируются точно в один и тот же код 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

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

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

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

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

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

проще говоря: для соединения строк, всегда используйте " & "вместо"+".

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

если оба типа статически типизированы в

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

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

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

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

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

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

    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