+
和&
在VB.NET中连接字符串之间有什么区别?
Answers:
如果两个操作数都是字符串,则没有区别。但是,如果一个操作数是字符串,一个是数字,则会遇到问题,请参见下面的代码。
"abc" + "def" = "abcdef"
"abc" & "def" = "abcdef"
"111" + "222" = "111222"
"111" & "222" = "111222"
"111" & 222 = "111222"
"111" + 222 = 333
"abc" + 222 = conversion error
因此,我建议&
在要连接时始终使用,因为您可能试图将整数,浮点数,十进制连接到字符串,这将导致异常,或者充其量是不执行您可能希望执行的操作。
&
字符串连接有问题。从文档“不管选项严格设置如何,&运算符始终将其操作数扩展为String”。因此,例如,"Hello " & 2.5
将使用区域设置将2.5静默转换为字符串(您可能会得到"2.5"
或"2,5"
)。好的,如果那是您想要的。我宁愿被迫明确指定。
"abc" & 222
("abc222"
)时返回的内容。
333
倒数第二行实际上是type System.Double
。
&运算符始终确保两个操作数均为字符串,而+运算符查找与该操作数匹配的重载。
表达式1 & 2
给出的值是“ 12”,而表达式1 + 2给出的值是3。
如果两个操作数都是字符串,则结果没有差异。
Option Strict
是Off
。但是,无论Option Strict
设置如何,&运算符都将隐式转换为字符串。文档“无论选项Strict的设置如何,&运算符始终将其操作数扩展为String”。因此,例如,"Hello " & 2.5
将使用区域设置将2.5静默转换为字符串(您可能会得到"2.5"
或"2,5"
)。好的,如果那是您想要的。
没有。
如下所示。这两行代码完全编译为相同的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
在大多数情况下没有区别。但是,最佳做法是:
应该为整数加法保留“ +” ,因为如果您不使用Option Strict On,那么您可能会陷入困境,例如:
Input + 12
可能给你20
而不是812
。这在输入来自POST / GET的ASP.NET应用程序中尤其糟糕。
简而言之:对于连接字符串,请始终使用“&”而不是“ +”。
显然,在合适的地方使用StringBuilder :)
如果这两种类型都静态键入为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
直接来自MSDN文档:Visual Basic中的串联运算符
两个串联运算符之间的差异
+运算符(Visual Basic)的主要目的是将两个数字相加。但是,它也可以将数字操作数与字符串操作数连接在一起。+运算符具有一组复杂的规则,这些规则确定是添加,连接,发信号通知编译器错误还是引发运行时InvalidCastException异常。
&运算符(Visual Basic)仅为String操作数定义,并且无论Option Strict的设置如何,它始终将其操作数扩展为String。建议将&运算符用于字符串连接,因为它是专门为字符串定义的,可减少生成意外转换的机会。
相信MSDN!:-)