Programing

VB.NET에서 문자열을 결합하기위한 +와 &의 차이점

crosscheck 2020. 11. 18. 08:33
반응형

VB.NET에서 문자열을 결합하기위한 +와 &의 차이점


차이 무엇 +&VB.NET에서 문자열을 접합는?


두 피연산자가 모두 문자열이면 차이가 없습니다. 그러나 피연산자 하나가 문자열이고 하나가 숫자이면 문제가 발생합니다. 아래 코드를 참조하십시오.

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

따라서 &연결하려는 경우 항상 사용하는 것이 좋습니다 . 정수, 부동 소수점, 10 진수를 문자열에 연결하려고 할 수 있으므로 예외가 발생하거나 기껏해야 원하는 작업을 수행하지 않을 수 있습니다.


& 연산자는 항상 두 피연산자가 문자열인지 확인하고 + 연산자는 피연산자와 일치하는 오버로드를 찾습니다.

표현식 1 & 2은 "12"값을 제공하고 표현식 1 + 2는 값 3을 제공합니다.

두 피연산자가 모두 문자열이면 결과에 차이가 없습니다.


없음.

아래에서 볼 수 있습니다. 이 두 줄의 코드는 정확히 동일한 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

+ 연산자는 더하기 또는 연결 일 수 있습니다. &는 연결 일뿐입니다. 표현식이 두 문자열 인 경우 결과는 동일합니다.

문자열로 작업 할 때는 &를 사용하고 숫자로 작업 할 때는 +를 사용하므로 내 의도에 대해 혼동이 없습니다. 실수로 +를 사용하고 하나의 표현식이 문자열이고 하나는 숫자 인 경우 원하지 않는 결과가 발생할 위험이 있습니다.


대부분의 경우 차이가 없습니다. 그러나 모범 사례는 다음과 같습니다.

"+" should be reserved for integer additions, because if you don't use Option Strict On then you might have really messed up situations such as:

Input + 12 might give you 20 instead of 812. This can be especially bad in an ASP.NET application where the input comes from POST/GET.

Simply put: For joining strings, always use "&" instead of "+".

Obviously, use StringBuilder where it's suitable :)


If both of the types are statically typed to System.String, there is zero difference between the code. Both will resolve down to the String.Concat member (this is what + does for strings).

However, if the objects are not strongly typed to string, Visual Basic late binding will kick in and go two very different routes. The + version will attempt to do an add operation which literally tries to add the objects. This will do all manner of attempts to convert both values to a number and then add them.

The & operator will attempt to concatenate. The Visual Basic runtime will go through all manner of conversions to convert both values to strings. It will then String.Concat the results.


Straight from MSDN Documentation: Concatenation Operators in Visual Basic

Differences Between the Two Concatenation Operators

The + Operator (Visual Basic) has the primary purpose of adding two numbers. However, it can also concatenate numeric operands with string operands. The + operator has a complex set of rules that determine whether to add, concatenate, signal a compiler error, or throw a run-time InvalidCastException exception.

The & Operator (Visual Basic) is defined only for String operands, and it always widens its operands to String, regardless of the setting of Option Strict. The & operator is recommended for string concatenation because it is defined exclusively for strings and reduces your chances of generating an unintended conversion.

Do trust MSDN! :-)


None when joining strings:

    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

참고URL : https://stackoverflow.com/questions/734600/the-difference-between-and-for-joining-strings-in-vb-net

반응형