2011-01-12 4 views
8

언제 연결 연산자 대신 String.Format 또는 String.Concat을 사용해야합니까?

var newString = "The answer is '" + value + "'."; 

사용 String.Format : 연결 연산자 사용

: 것이 가능 C#에서

은 여러 가지 방법으로 문자열을 연결

var newString = String.Format("The answer is '{0}'.", value); 

사용하여 String.Concat :

var newString = String.Concat("The answer is '", value, "'."); 

이 방법들 각각의 장점/단점은 무엇입니까? 언제 다른 사람들보다 하나를 선호해야합니까?

문제는 개발자 간의 토론 때문에 발생합니다. 하나의 결코은 연결을 위해 String.Format을 사용하지 않습니다. 이것은 문자열의 서식 지정을위한 것이지 병합을위한 것이 아니며 문자열의 항목이 잘못된 순서로 표현되기 때문에 항상 읽을 수 없습니다. 다른 은 종종 String.Format을 연결에 사용합니다. 코드를 쉽게 읽을 수 있다고 생각하기 때문에, 특히 인용 부호가 여러 세트 인 경우 특히 그렇습니다. 이 두 개발자는 모두 연결 연산자와 String.Builder도 사용합니다.

답변

16

속도에 대해서는 거의 항상 doesn't matter입니다. 당신이 코드에서 문자열을 추출하는 결정합니다 그래서 만약

var answer = "Use what makes " + "the code most easy " + "to read"; 
+0

+1 바람직하지 않은 downvote를 막기 위해서. – LukeH

+0

예, 좋은 링크 +1입니다. – StuartLC

+4

문자열 연결을 사용하면 메모리에 많은 작은 개체가 생성되어 가비지 수집 성능에 부정적인 영향을 줄 수 있습니다. 링크에서 테스트하여 이러한 영향을 측정하는 것은 매우 어렵지만 성능 요구 사항이 까다로운 대형 시스템의 경우 매우 큰 성능 문제 일 수 있습니다. –

2

종종 성능 고려 사항이이 결정의 원동력입니다. Ayende의 this 문서를 참조하십시오.

0

그런 다음 및 String.format로는

+1

왜 안 되니? 국제화를 예상 할 때 이것이 문제가 될 수 있다는 점에 감사드립니다. 그러나 많은 앱에서 이것은 결코 고려되지 않습니다. – Kramii

+0

Never never say :) –

3

나 '때 보통 및 String.format를 사용을 할 수 쉬울 것 코드에서 문자열을 저장하는 것이 좋습니다 아니에요 최종 결과가 어떻게 보이는지를보다 쉽게 ​​알기 때문에 2 개 또는 3 개 이상의 값을 연결합니다. 각 작업에 대해 새 문자열 객체를 만들어야하므로 문자열 연결은 느립니다.

5 개 이상의 문자열을 조인해야하는 경우 StringBuilder를 사용하면 속도가 훨씬 빨라집니다.

+1

String.Concat이 StringBuilder를 사용하도록 제안하므로 성능 인수가 여기에서 실패합니다. –

+1

실제로. 인수가'Concat'와'Format'의 상대적 성능에 관한 것이라면, 당신이 뭔가 미친 짓을하지 않는 한,'Concat'가 매번 승리 할 것입니다. – LukeH

3

나는 일반적으로 가독성을 위해 사용하며 형식을 사용하는 경향이 있습니다. 대부분의 코드는 한 번만 쓰여지고 여러 번 읽혀 지므로 독자가 자신이 진술 한 것이 무엇인지 빨리 이해할 수 있는지 확인하는 것이 중요합니다 (나에게).

3

궁금한 점이 있지만 String.Format은 StringBuilder.AppendFormat()을 내부적으로 사용합니다. 당신이 here을 찾을 수 있습니다 이것에 대해

public static string Format(IFormatProvider provider, string format, params object[] args) 
{ 
    if (format == null || args == null) 
    throw new ArgumentNullException((format == null ? "format" : "args")); 

    StringBuilder builder = new StringBuilder(format.Length + (args.Length * 8)); 
    builder.AppendFormat(provider, format, args); 
    return builder.ToString(); 
} 

더 예를 들어, 및 String.format 코드처럼 찾고 있습니다. 그럼, 왜 우리는 여기에 StringBuilder.AppendFormat()에 대해 언급하지 않았다! 질문의 요점에 관해서는

:

의 핵심은 작업에 가장 적합한 도구를 선택하는 것입니다. 무슨 뜻이야?지혜의 이러한 멋진 말을 생각해

* Concatenate (+) is best at concatenating. 
* StringBuilder is best when you need to building. 
* Format is best at formatting. 
0

이는 IL를 생성하는 데 사용되는 다양한 연결 방법과 컴파일러 최적화를위한 메모리 사용에 대한 기사입니다. Concatenation methods and optimization issue

+1

기사에 링크하는 것이 좋지만, 선택 정보를 추출하여 여기에 게시하는 것이 좋습니다. 그 블로그가 사라지거나 언젠가 옮겨지면 쓸모없는 대답이됩니다. – Mike

관련 문제