在VB.NET中joinstring的+和&的区别

在VB.NET中joinstring的“ +和“ &什么区别?

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

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

因此,我build议总是使用&当你意味着连接,因为你可能试图将一个整数,浮点数,十进制连接到一个string,这将导致一个exception,或者最好,不要做你可能想要做的事情。

&运算符总是确保两个操作数都是string,而+运算符find与操作数匹配的过载。

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

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

没有。

正如你可以看到下面。 这两行代码完全符合相同的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 

+运算符可以是加法或连接。 &只是串联。 如果expression式都是string,结果将是相同的。

我在使用string时使用&,在使用数字时使用+,所以我的意图绝不会混淆。 如果你错误地使用了+,而一个expression式是一个string,而另一个是一个数字,那么就会冒着不想要的结果的风险。

大部分情况没有区别。 但是,最好的做法是:

“+”应该保留为整数加法 ,因为如果你不使用Option Strict On,那么你可能真的搞砸了,例如:

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

简单地说: 对于连接string,总是使用“&”而不是“+”。

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

如果这两个types都静态types为System.String ,代码之间没有差异。 两者都将解决到String.Concat成员(这是什么+的string)。

但是,如果对象没有强types化为string,则Visual Basic后期绑定将启动并执行两个完全不同的路由。 +版本将尝试执行添加操作,从字面上试图添加对象。 这将尝试将这两个值转换为数字,然后添加它们的所有方式。

&运算符将尝试连接。 Visual Basic运行库将通过所有转换方式将这两个值转换为string。 它会然后String.Concat的结果。

直接从MSDN文档: 在Visual Basic中的串联运算符

两个级联算子之间的差异

+运算符(Visual Basic)的主要目的是添加两个数字。 但是,它也可以将数字操作数与string操作数连接起来。 +运算符具有一组复杂的规则,用于确定是否添加,连接,发出编译器错误,或引发运行时InvalidCastExceptionexception。

&操作符(Visual Basic)仅为string操作数定义,并且无论Option Strict的设置如何,它总是将其操作数扩展为string。 &运算符build议用于string连接,因为它是专门为string定义的,并减less了产生意外转换的机会。

请相信MSDN! 🙂

joinstring时无

  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