VB.NET中用于连接字符串的+和&之间的区别


Answers:


90

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

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

因此,我建议&在要连接时始终使用,因为您可能试图将整数,浮点数,十进制连接到字符串,这将导致异常,或者充其量是不执行您可能希望执行的操作。


11
或者始终将Option Strict On(强制严格启用),在这种情况下,您无需担心。选项严格上有许多其他优点:stackoverflow.com/questions/222370/...
mattmc3

3
&字符串连接有问题。从文档“不管选项严格设置如何,&运算符始终将其操作数扩展为String”。因此,例如,"Hello " & 2.5将使用区域设置将2.5静默转换为字符串(您可能会得到"2.5""2,5")。好的,如果那是您想要的。我宁愿被迫明确指定。
MarkJ 2011年

@MarkJ哦,是的,如果您不看的话,那地方性的东西真的可以帮您。特别是在Web服务器上。如果您有一堆Web服务器,则应确保将它们都配置为相同的区域设置,以免出现数字和日期格式问题。
Kibbee

5
为了完整性,还应该注意执行"abc" & 222"abc222")时返回的内容。
Dan Atkinson 2014年

2
让我提到,333倒数第二行实际上是type System.Double
弗拉基米尔·雷谢尼科夫(Fladimir Reshetnikov),

13

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

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

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


+操作者只执行如果隐式转换Option StrictOff。但是,无论Option Strict设置如何,&运算符都将隐式转换为字符串。文档“无论选项Strict的设置如何,&运算符始终将其操作数扩展为String”。因此,例如,"Hello " & 2.5将使用区域设置将2.5静默转换为字符串(您可能会得到"2.5""2,5")。好的,如果那是您想要的。
MarkJ 2011年

8

没有。

如下所示。这两行代码完全编译为相同的CIL代码:

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

感谢Aliostad,总结起来很完美。我对如何处理它很好奇(可能应该在我的问题中将其概述得更好一些)。字符串+字符串(只要它们都是字符串)与字符串和字符串相同(无论使用+运算符的复杂规则集如何)。

没有问题。使用ILDASM查看IL代码始终是一件好事。最初并不熟悉,但是逐渐习惯了。
Aliostad

3

+运算符可以是加法或串联。&仅是串联。如果两个表达式都是字符串,则结果将相同。

在处理字符串时,我使用&;在处理数字时,我使用+,因此我的意图从不混淆。如果您错误地使用+并且一个表达式是一个字符串而一个表达式是一个数字,则可能会出现不希望的结果。


2

在大多数情况下没有区别。但是,最佳做法是:

应该为整数加法保留“ +” ,因为如果您不使用Option Strict On,那么您可能会陷入困境,例如:

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

简而言之:对于连接字符串,请始终使用“&”而不是“ +”。

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


1

如果这两种类型都静态键入为System.String,则代码之间的差为零。两者都将解析为String.Concat成员(这就是+字符串的作用)。

但是,如果未将对象强类型化为字符串,则Visual Basic后期绑定将启动,并走两条截然不同的路线。该+版本将尝试添加操作,该操作实际上会尝试添加对象。这将进行所有尝试,将两个值都转换为数字,然后将它们相加。

&运营商将试图串连。Visual Basic运行时将进行所有形式的转换,以将两个值都转换为字符串。然后String.Concat将结果。


还值得一提的是,&运营商无视Option Strict。从文档“不管选项严格设置如何,&运算符始终将其操作数扩展为String”。因此,例如,"Hello " & 2.5将使用区域设置将2.5静默转换为字符串(您可能会得到"2.5""2,5")。好的,如果那是您想要的。与+何时存在严格的对比Option Strict On
MarkJ 2011年

1

直接来自MSDN文档:Visual Basic中的串联运算符

两个串联运算符之间的差异

+运算符(Visual Basic)的主要目的是将两个数字相加。但是,它也可以将数字操作数与字符串操作数连接在一起。+运算符具有一组复杂的规则,这些规则确定是添加,连接,发信号通知编译器错误还是引发运行时InvalidCastException异常。

&运算符(Visual Basic)仅为String操作数定义,并且无论Option Strict的设置如何,它始终将其操作数扩展为String。建议将&运算符用于字符串连接,因为它是专门为字符串定义的,可减少生成意外转换的机会。

相信MSDN!:-)


0

连接字符串时无:

    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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.