여기에있는 답변이 모든 것을 다룰 수는 없다고 생각하기 때문에 여기에 약간의 추가를하고 싶습니다.
Console.WriteLine(string format, params object[] pars)
전화 string.Format
. '+'는 문자열 연결을 의미합니다. 나는 이것이 항상 스타일과 관련이 있다고 생각하지 않습니다. 나는 상황에 따라 두 가지 스타일을 혼합하는 경향이 있습니다.
짧은 답변
당신이 직면하고있는 결정은 문자열 할당과 관련이 있습니다. 간단하게 해보도록하겠습니다.
당신이 가지고 있다고
string s = a + "foo" + b;
이를 실행하면 다음과 같이 평가됩니다.
string tmp1 = a;
string tmp2 = "foo"
string tmp3 = concat(tmp1, tmp2);
string tmp4 = b;
string s = concat(tmp3, tmp4);
tmp
여기서는 실제로 로컬 변수가 아니지만 JIT의 임시 변수입니다 (IL 스택에서 푸시 됨). ldstr
리터럴의 경우 IL에서 와 같이 스택에서 문자열을 푸시하면 스택 의 문자열 포인터에 대한 참조를 넣습니다.
concat
두 문자열을 모두 포함하는 문자열 참조가 없기 때문에이 참조 를 호출하는 순간 문제가됩니다. 이는 .NET이 새로운 메모리 블록을 할당 한 다음 두 문자열로 채워야한다는 것을 의미합니다. 이것이 문제인 이유는 할당이 상대적으로 비싸기 때문입니다.
질문을 다음과 같이 변경하는 방법 : concat
작업 수를 어떻게 줄일 수 있습니까?
따라서 대략적인 대답은 다음과 같습니다. string.Format
> 1 concats의 경우 '+'는 1 concat에 적합합니다. 그리고 마이크로 퍼포먼스 최적화에 신경 쓰지 않는다면 string.Format
일반적인 경우에는 잘 작동합니다.
문화에 관한 메모
그리고 문화라는 것이 있습니다 ...
string.Format
CultureInfo
서식 에 사용할 수 있습니다 . 간단한 연산자 '+'는 현재 문화권을 사용합니다.
파일 형식과 f.ex를 작성하는 경우 특히 중요합니다. double
문자열에 '추가'하는 값. 다른 컴퓨터에서는 string.Format
explicit와 함께 사용하지 않으면 다른 문자열로 끝날 수 있습니다 CultureInfo
.
F.ex. '.'를 변경하면 어떻게되는지 고려하십시오. 네덜란드어로 쉼표로 구분 된 값 파일을 쓰는 동안 ','의 경우 소수점 구분 기호는 쉼표이므로 사용자는 '재미있는'놀라움을 얻을 수 있습니다.
더 자세한 답변
사전에 정확한 문자열 크기를 모르는 경우 사용하는 버퍼를 전체 화하기 위해 이와 같은 정책을 사용하는 것이 가장 좋습니다. 여유 공간이 먼저 채워진 후 데이터가 복사됩니다.
성장이란 새로운 메모리 블록을 할당하고 이전 데이터를 새로운 버퍼에 복사하는 것을 의미합니다. 그런 다음 이전 메모리 블록을 해제 할 수 있습니다. 이 시점에서 결론을 얻습니다. 성장은 비용이 많이 드는 작업입니다.
이를 수행하는 가장 실용적인 방법은 초과 할당 정책을 사용하는 것입니다. 가장 일반적인 정책은 2의 거듭 제곱으로 버퍼를 전체적으로 할당하는 것입니다. 물론 128 문자가 필요하다는 것을 이미 알고 있다면 1,2,4,8에서 성장하는 것이 이치에 맞지 않으므로 조금 더 똑똑해야합니다. ) 그러나 당신은 그림을 얻는다. 이 정책은 위에서 설명한 값 비싼 작업이 너무 많이 필요하지 않도록합니다.
StringBuilder
기본적으로 기본 버퍼를 2의 거듭 제곱으로 분류하는 클래스입니다. 후드 아래에서 string.Format
사용 StringBuilder
합니다.
이것은 당신의 결정을 전체적인 할당과 추가 (복수) (배양없이) 또는 단지 할당과 추가 사이의 기본적인 절충점으로 만듭니다.
string.Format
합성 형식화 기능을 사용하지 않고 (즉, 단순함{0}
) 훨씬 빠른 문자열 연결로 대체 하는지 궁금합니다 . PostSharp와 같은 기존 IL 리 라이터를 통해 이러한 성과를 달성 할 수 있을지 궁금합니다.