StringBuilder.appendline/String.format vs. StringBuilder.appendFormat는 언제 사용합니까?

StackOverflow https://stackoverflow.com/questions/349724

문제

최근 질문이 나타났습니다 String.format () 사용 정보. 내 대답의 일부에는 StringBuilder.appendline (String.format (...))를 사용하라는 제안이 포함되었습니다. Jon Skeet은 이것이 나쁜 예라고 제안했으며 Appendline과 AppendFormat의 조합을 사용하여 제안했습니다.

나는이 방법을 사용하기위한 "선호하는"접근법에 실제로 자신을 정착시킨 적이 없다. 나는 다음과 같은 것을 사용하기 시작할 수 있다고 생각하지만 다른 사람들이 "모범 사례"로 사용하는 것을 알고 싶어합니다.

sbuilder.AppendFormat("{0} line", "First").AppendLine();
sbuilder.AppendFormat("{0} line", "Second").AppendLine();

// as opposed to:

sbuilder.AppendLine( String.Format( "{0} line", "First"));
sbuilder.AppendLine( String.Format( "{0} line", "Second"));
도움이 되었습니까?

해결책

나는 본다 AppendFormat 그 뒤에 AppendLine 더 읽기 쉬울뿐만 아니라 전화보다 더 성능이 뛰어납니다. AppendLine(string.Format(...)).

후자는 완전히 새로운 줄을 생성 한 다음 기존 빌더에 도매를 추가합니다. 나는 "그때 StringBuilder를 사용하는 이유는 무엇입니까?"라고 말하는 것만 큼 멀리 가지 않을 것입니다. 그러나 그것은 StringBuilder의 정신에 반대하는 것처럼 보입니다.

다른 팁

확장 방법 만 작성하십시오.

public static StringBuilder AppendLine(this StringBuilder builder, string format, params object[] args)
{
    builder.AppendFormat(format, args).AppendLine();
    return builder;
}

내가 이것을 선호하는 이유 :

  • 오버 헤드만큼 고통받지 않습니다 AppendLine(string.Format(...)), 상술 한 바와 같이.
  • 추가를 잊지 못하게합니다 .AppendLine() 끝에 부분 (자주 발생합니다).
  • 더 읽기 쉽다 (그러나 그것은 더 많은 의견이다).

'부록'이라는 것을 좋아하지 않는다면 'AppendFormattedLine'또는 원하는대로 변경할 수 있습니다. 나는 '부록'에 대한 다른 전화로 줄을서는 모든 것을 즐깁니다.

var builder = new StringBuilder();

builder
    .AppendLine("This is a test.")
    .AppendLine("This is a {0}.", "test");

StringBuilder에서 appendformat 메소드를 사용하는 각 오버로드 마다이 중 하나를 추가하십시오.

string.format 내부 StringBuilder 개체를 만듭니다. 그렇게함으로써

sbuilder.AppendLine( String.Format( "{0} line", "First"));

모든 오버 헤드가있는 String Builder의 추가 인스턴스가 생성됩니다.


mscorlib, commonlauageruntimelibary, system.string.format의 반사기

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();
}

성능이 중요하다면 AppendFormat ()를 완전히 피하십시오. 대신 여러 부록 () 또는 부록 () 호출을 사용하십시오. 이것은 코드를 더 크고 읽기 쉽게 만들 수 있지만 문자열 구문 분석을 수행 할 필요가 없기 때문에 더 빠릅니다. 문자열 구문 분석은 상상할 수있는 것보다 느립니다.

나는 일반적으로 사용한다 :

sbuilder.AppendFormat("{0} line", "First");
sbuilder.AppendLine();
sbuilder.AppendFormat("{0} line", "Second");
sbuilder.AppendLine();

성능이 중요하지 않으면 사용하는 경우를 사용합니다.

sbuilder.Append("First");
sbuilder.AppendLine(" line");
sbuilder.Append("Second");
sbuilder.AppendLine(" line");

(물론 문자열이 아닌 경우 "첫 번째"및 "두 번째"라면 더 의미가 있습니다)

부록 ()는 부록 (string.format ())보다 훨씬 더 읽기 쉬운다.

나는이 구조를 선호한다 :

sbuilder.AppendFormat("{0} line\n", "First");

비록 분명히 라인 브레이크를 분리하기 위해 할 말이 있습니다.

단순히 사용하는 것이 긍정적으로 끔찍합니까?

sbuilder.AppendFormat("{0} line\n", first);

? 내 말은, 그것이 플랫폼 독립적이거나 다른 것이 아니라는 것을 알고 있지만 10 개 중 9 건에서 작업이 완료됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top