'+'연산자를 사용한 문자열 연결


답변:


143

그렇지 않습니다-C # 컴파일러는 :)

그래서이 코드 :

string x = "hello";
string y = "there";
string z = "chaps";
string all = x + y + z;

실제로 다음과 같이 컴파일됩니다.

string x = "hello";
string y = "there";
string z = "chaps";
string all = string.Concat(x, y, z);

(Gah-중간 편집이 실수로 다른 비트를 제거했습니다.)

여기에 여러 개의 문자열 연결이 있음을 인식하는 C # 컴파일러의 이점은 중간 문자열을 생성하지 않고 및 x + y연결의 일부로 다시 복사해야한다는 것 입니다. 대신 한 번에 모든 작업을 수행합니다.(x + y)z

편집 : 루프에서 연결하면 컴파일러 가 아무것도 할 수 없습니다 . 예를 들어 다음 코드는 다음과 같습니다.

string x = "";
foreach (string y in strings)
{
    x += y;
}

다음과 같이 끝납니다.

string x = "";
foreach (string y in strings)
{
    x = string.Concat(x, y);
}

... 그래서 이것은 않는 쓰레기를 많이 생성하고, 당신이 사용해야하는 이유입니다 StringBuilder같은 경우에. 더 많은 질문에 답할 수 있도록 두 가지에 대해 자세히 설명 하는 기사 가 있습니다 .


8
좋은 대답입니다. 후속 질문입니다. 루프 내에서 문자열을 연결하는 경우 루프에 포함될 내용을 미리 알 수 없을 때 컴파일러가 .Concat 연산자를 어떻게 작동합니까?
frenchie

그래! 그래서 연결을 위해 StringBuilder를 사용하는 것이 더 낫습니까?
frenchie

4
@frenchie : 그렇기 때문에 반복적 인 연결 을 위해 StringBuilder를 사용하는 것이 더 낫지 만 고정 된 수의 값 을 연결하는 데는 가치가 없습니다 .
Jon Skeet 2012

@ Jon-Skeet : 빠른 설명에 감사드립니다 ... IL도 확인 했어야했는데 이것이 int도 추가하는 방법입니까? Add 메서드를 호출하여?
NoviceProgrammer

2
그러나 오늘날 string.Concatstring.Join메서드에는 IEnumerable<>인스턴스를 가져 오는 것을 포함하여 많은 오버로드가 있습니다 . 그들이 사용하는 것보다 대부분의 경우에 사용하는 것이 더 편리합니다 그래서 StringBuilder(이 방법은을 사용하는 경우 나도 몰라 StringBuilder내부적으로 나는 단지 그들이 대부분의 경우에 더 편리한 것을 말한다).
Jeppe Stig Nielsen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.