web-dev-qa-db-ja.com

VB.NETで文字列を結合するための+と&の違い

違いは何ですか +および& VB.NETで文字列を結合するには?

64
Rob P.

両方のオペランドが文字列の場合、違いはありません。ただし、一方のオペランドが文字列で、もう一方が数値の場合、問題が発生します。以下のコードを参照してください。

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

したがって、整数、浮動小数点、小数を文字列に連結しようとする可能性があるため、連結する場合は常に&を使用することをお勧めします。それを行う。

84
Kibbee

&演算子は常に両方のオペランドが文字列であることを確認し、+演算子はオペランドに一致するオーバーロードを見つけます。

表現 1 & 2は値 "12"を与え、式1 + 2は値3を与えます。

両方のオペランドが文字列の場合、結果に違いはありません。

13
Guffa

なし。

以下をご覧ください。次の2行のコードは、まったく同じ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
7
Aliostad

+演算子は、加算または連結のいずれかです。 &は連結のみです。式が両方とも文字列の場合、結果は同じになります。

文字列を操作するときは&を使用し、数字を操作するときは+を使用しているため、意図が混乱することはありません。誤って+を使用し、1つの式が文字列で1つが数値の場合、望ましくない結果が生じるリスクがあります。

3
dbasnett

ほとんどの場合、違いはありません。ただし、ベストプラクティスは次のとおりです。

「+」は、整数加算用に予約する必要があります。なぜなら、Option Strict Onを使用しない場合あなたは本当に次のような状況を台無しにしたかもしれません:

Input + 12はあなたに20 の代わりに 812。これは、入力がPOST/GETから来るASP.NETアプリケーションでは特に悪い場合があります。

簡単に言えば:文字列を結合するには、常に「+」ではなく「&」を使用します。

もちろん、適切な場所では StringBuilder を使用してください:)

2
dr. evil

両方のタイプが静的に System.String に型付けされている場合、コード間に違いはありません。両方とも String.Concat メンバーに解決されます(これが+は文字列に対応しています)。

ただし、オブジェクトが文字列に強く型付けされていない場合、Visual Basicの遅延バインディングが開始され、2つのまったく異なるルートに進みます。 + versionは、文字通りオブジェクトを追加しようとするadd操作を実行しようとします。これにより、両方の値を数値に変換してから追加するためのあらゆる方法が試行されます。

&演算子は連結を試みます。 Visual Basicランタイムは、あらゆる種類の変換を行って、両方の値を文字列に変換します。その後、String.Concat 結果。

1
JaredPar

MSDNドキュメントから直接: Visual Basicの連結演算子

2つの連結演算子の違い

+演算子(Visual Basic)の主な目的は、2つの数値を追加することです。ただし、数値オペランドと文字列オペランドを連結することもできます。 +演算子には、追加、連結、コンパイラエラーの通知、実行時InvalidCastException例外のスローのいずれかを決定する複雑なルールセットがあります。

&演算子(Visual Basic)は文字列オペランドに対してのみ定義され、Option Strictの設定に関係なく、常にオペランドを文字列に広げます。 &演算子は、文字列専用に定義されており、意図しない変換を生成する可能性を減らすため、文字列の連結に推奨されます。

MSDNを信頼してください! :-)

1
FranciscoBouza

文字列を結合する場合はなし:

    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
0
Gavin Miller