在 VB.NET 中 + 和 & 连接字符串的区别

在 VB.NET 中连接字符串时,+&的区别是什么?

84945 次浏览

在加入字符串时没有:

    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

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

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

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

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

“ +”应该为 整数加法保留,因为如果你不使用 严格执行,那么你可能会有真正混乱的情况,如:

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

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

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

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

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

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

+ 运算符可以是加法或连接。& 只是连接。如果两个表达式都是字符串,结果将是相同的。

我在处理字符串时使用 & ,在处理数字时使用 + ,因此从不会混淆我的意图。如果错误地使用 + ,其中一个表达式是字符串,另一个表达式是数字,则可能会产生不希望看到的结果。

如果这两种类型都是静态类型为 系统。字符串,则代码之间没有任何差异。两者都将解析为 字符串,连接成员(这是 +对字符串所做的)。

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

&操作符将尝试连接。VisualBasic 运行库将执行各种转换以将这两个值转换为字符串。然后它将 String.Concat的结果。

没有。

如下所示,这两行代码完全可以编译成相同的 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

直接来自 MSDN 文档: VisualBasic 中的连接运算符

两种级联算子的区别

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

& 运算符(VisualBasic)仅为 String 操作数定义,并且 它总是将其操作数扩展为 String,而不管 选项严格。建议使用 & 运算符进行字符串串联 因为它是专门为字符串定义的,因此减少了机会 产生意想不到的转换。

请相信 MSDN! : -)