ToString 용법
아니요, ToString여기서 사용해서는 안됩니다 .
문자열 연결은 문자열이 아닌 문자열을 자동으로 문자열로 변환하므로 두 변형이 거의 ¹ 동일하다는 것을 의미합니다.
피연산자 중 하나 또는 둘 모두가 문자열 유형 인 경우 사전 정의 된 추가 연산자는 피연산자의 문자열 표시를 연결합니다.
출처 : C # 언어 사양 : 추가 연산자, MSDN .
반면에 첫 번째 것은 (없이 ToString) :
- 작성하는 것이 더 짧습니다.
- 읽기가 더 짧습니다.
- 유지 보수가 쉽고 다음과 같습니다.
- 문자열을 연결하는 저자의 의도를 정확하게 보여줍니다.
따라서 첫 번째를 선호하십시오.
후드
흥미로운 것은 후드 아래에서 무슨 일이 일어나는지 보는 것입니다. 이를 보는 방법 중 하나는 LINQPad 내에서 IL 코드를 보는 것입니다. 이 프로그램:
void Main()
{
var a = 3;
var b = " Hello";
var c = a + b;
Console.WriteLine(c);
}
다음 IL로 번역됩니다.
IL_0001: ldc.i4.3
IL_0002: stloc.0 // a
IL_0003: ldstr " Hello"
IL_0008: stloc.1 // b
IL_0009: ldloc.0 // a
IL_000A: box System.Int32
IL_000F: ldloc.1 // b
IL_0010: call System.String.Concat
IL_0015: stloc.2 // c
IL_0016: ldloc.2 // c
IL_0017: call System.Console.WriteLine
저거 봐 System.String.Concat? 즉, 원래 코드도 이와 같이 작성 될 수 있으며 이는 정확히 동일한 IL로 변환됩니다.
void Main()
{
var a = 3;
var b = " Hello";
var c = string.Concat(a, b); // This is the line which was changed.
Console.WriteLine(c);
}
의 설명서string.Concat(object[]) 를 읽으면 다음을 배울 수 있습니다.
이 메소드 는 해당 오브젝트 의 매개 변수없는 메소드를 호출하여 인수 로 각 오브젝트를 연결 ToString합니다. 구분자를 추가하지 않습니다.
이것은 ToString중복 됨을 의미합니다 . 또한:
String.Empty 배열에서 null 객체 대신 사용됩니다.
피연산자 중 일부가 null 인 경우를 잘 처리합니다 (각주 1 참조).
마지막 예제에서 연결이로 변환되었지만 string.Concat컴파일러 최적화도 강조해야합니다.
var a = "Hello " + "World";
로 번역됩니다 :
ldstr "Hello World"
stloc.0
반면에 :
var a = string.Concat("Hello ", "World");
로 번역됩니다 :
ldstr "Hello "
ldstr "World"
call System.String.Concat
stloc.0
다른 대안들
물론 C #에서 개체의 문자열 표현을 연결하는 다른 방법이 있습니다.
StringBuilder많은 연결 작업을 수행해야 할 때 사용되며 생성 된 중간 문자열 수를 줄이는 데 도움이됩니다. StringBuilder연결을 사용해야하는지 일반 연결을 사용해야하는지 결정 하기가 쉽지 않을 수 있습니다. 프로파일 러를 사용하거나 스택 오버플로에서 관련 답변을 검색하십시오.
를 사용 StringBuilder하면 코드를 읽고 유지 관리하기가 어렵다는 큰 단점이 있습니다. 귀하의 질문에있는 간단한 경우 StringBuilder, 코드의 가독성에 해를 끼칠뿐만 아니라 성능면에서 쓸모가 없습니다.
string.Join 구분 기호를 추가해야 할 때 사용해야합니다.
분명히 string.Join빈 분리 문자와 함께 사용 하여 문자열을 연결 하지 마십시오 .
string.Format문자열 템플릿보다 문자열 템플릿을 선호하는 경우 사용할 수 있습니다. kunthet의 답변에서 제안한 것처럼 메시지를 현지화 할 수있는 경우가 있습니다.
를 사용하면 string.Format몇 가지 단점이 있으므로 다음과 같은 간단한 경우에는 적합하지 않습니다.
단순한 "{0}"자리 표시자를 사용하면 어느 매개 변수가 어디로 가는지 불분명합니다. 실수로 매개 변수를 반대로 바꾸거나 잊어 버리는 경우가 많습니다. 운 좋게도 C # 6은 마침내이 문제를 해결하는 문자열 보간법을 도입 합니다.
런타임 성능이 저하 될 수 있습니다. 물론, 가정하지 않는 string.Format것입니다 항상 느린. 성능이 중요한 경우 두 가지 접근 방식을 측정하고 가정 대신 실제 결과에 따라 더 빠른 접근 방법을 결정하십시오.
코드는 작성하기에 약간 더 길고, 읽기에 더 길고, 유지하기가 더 어렵습니다.
¹ 개체 중 하나가이면 차이가 나타납니다 null. 이 없으면 ToStringa null가 빈 문자열로 바뀝니다. 와 함께 ToStringa NullReferenceException가 발생합니다.
a + "" + b + ""또는"" + a + b + "", 그것은 중요하지 않습니다 : 그것은 모든 문자열 연결합니다. 에a + b + ""상관하지 :a그리고b처음에 추가됩니다.