代码之家  ›  专栏  ›  技术社区  ›  Rob P.

vb.net中连接字符串的+和&之间的差异

  •  59
  • Rob P.  · 技术社区  · 16 年前

    两者有什么区别 + & 用于在vb.net中联接字符串?

    8 回复  |  直到 9 年前
        1
  •  77
  •   Peter Mortensen icecrime    12 年前

    如果两个操作数都是字符串,则没有区别。但是,如果一个操作数是字符串,一个是数字,则会遇到问题,请参见下面的代码。

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

    因此,我建议始终使用 & 当您打算连接时,因为您可能试图将一个整数、浮点、小数连接到一个字符串,这将导致一个异常,或者最多不执行您可能希望它执行的操作。

        2
  •  13
  •   Guffa    16 年前

    &运算符始终确保两个操作数都是字符串,而+运算符查找与操作数匹配的重载。

    表达式 1 & 2 给出值“12”,而表达式1+2给出值3。

    如果两个操作数都是字符串,则结果没有区别。

        3
  •  7
  •   Aliostad    14 年前

    一个也没有。

    如你所见。这两行代码完全编译为相同的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
    
        4
  •  3
  •   dbasnett    16 年前

    +运算符可以是加法,也可以是串联。只是串联。如果表达式都是字符串,则结果将相同。

    我使用字符串时使用&和+使用数字时使用,因此不会混淆我的意图。如果您错误地使用+并且一个表达式是字符串,一个是数字,则可能会产生不需要的结果。

        5
  •  2
  •   Peter Mortensen icecrime    12 年前

    在大多数情况下没有区别。然而,最佳实践是:

    “+”应保留给 整数加法 因为如果你不使用 选项严格打开 那么你可能真的把情况搞砸了,比如:

    Input + 12 可能给你 20 而不是 812 . 这在输入来自post/get的ASP.NET应用程序中尤其糟糕。

    简单地说: 对于连接字符串,始终使用“&”而不是“+”。

    显然,使用 StringBuilder 在合适的地方:)

        6
  •  1
  •   Peter Mortensen icecrime    12 年前

    如果两种类型都静态类型为 System.String ,代码之间的差异为零。两者都将解决 String.Concat 成员(这就是 + 对于字符串)。

    但是,如果对象不是强类型化为字符串的,则VisualBasic后期绑定将启动并执行两个非常不同的路径。这个 + 版本将尝试执行 添加 试图添加对象的操作。这将进行各种尝试,将两个值转换为一个数字,然后添加它们。

    这个 & 运算符将尝试连接。VisualBasic运行时将进行各种转换,以将两个值都转换为字符串。到时候会的 String.Concat 结果。

        7
  •  1
  •   FranciscoBouza Adrian Jandl    9 年前

    直接从msdn文档: Concatenation Operators in Visual Basic

    两个连接运算符之间的区别

    +运算符(Visual Basic)主要用于添加两个 数字。但是,它也可以将数字操作数与字符串连接起来。 操作数。+运算符有一组复杂的规则,可以确定 是添加、连接、发出编译器错误信号,还是抛出 运行时InvalidcastException异常。

    &operator(Visual Basic)仅为字符串操作数定义,并且 它总是将操作数扩展为字符串,而不管 期权严格。建议使用&运算符进行字符串连接 因为它是专门为字符串定义的,减少了您的机会 生成意外的转换。

    相信MSDN!-)

        8
  •  0
  •   Gavin Miller    16 年前

    连接字符串时无:

        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