在 VB.NET 中连接字符串时,+和 &的区别是什么?
+
&
在加入字符串时没有:
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。
1 & 2
如果两个操作数都是字符串,则结果没有差异。
在大多数情况下没有区别,但是,最好的做法是:
“ +”应该为 整数加法保留,因为如果你不使用 严格执行,那么你可能会有真正混乱的情况,如:
Input + 12可能会给你 20而不是 812。在输入来自 POST/GET 的 ASP.NET 应用程序中,这种情况尤其糟糕。
Input + 12
20
812
简单地说: 对于连接字符串,始终使用“ &”而不是“ +”。
显然,在适当的地方使用 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的结果。
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) :
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,而不管 选项严格。建议使用 & 运算符进行字符串串联 因为它是专门为字符串定义的,因此减少了机会 产生意想不到的转换。
两种级联算子的区别
+ 运算符(VisualBasic)的主要用途是添加两个 但是,它也可以将数值操作数与字符串连接起来 + 运算符有一组复杂的规则,用于确定 是否添加、连接、发出编译器错误信号或引发 运行时 InvalidCastException 异常。
& 运算符(VisualBasic)仅为 String 操作数定义,并且 它总是将其操作数扩展为 String,而不管 选项严格。建议使用 & 运算符进行字符串串联 因为它是专门为字符串定义的,因此减少了机会 产生意想不到的转换。
请相信 MSDN! : -)