code

언제 StringBuilder.AppendLine / string.Format과 StringBuilder.AppendFormat을 사용합니까?

codestyles 2020. 12. 25. 09:52
반응형

언제 StringBuilder.AppendLine / string.Format과 StringBuilder.AppendFormat을 사용합니까?


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()마지막에 부품 을 추가하는 것을 잊는 것을 방지합니다 (충분히 자주 발생 함).
  • 더 읽기 쉽습니다 (그러나 그것은 더 많은 의견입니다).

'AppendLine'이라는 이름이 마음에 들지 않으면 'AppendFormattedLine'또는 원하는대로 변경할 수 있습니다. 나는 'AppendLine'에 대한 다른 호출과 일치하는 모든 것을 즐깁니다.

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"));

모든 오버 헤드가있는 문자열 작성기의 추가 인스턴스가 생성됩니다.


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 ()을 완전히 피하십시오. 대신 여러 Append () 또는 AppendLine () 호출을 사용하십시오. 이렇게하면 코드가 더 크고 가독성이 떨어지지 만 문자열 구문 분석을 수행 할 필요가 없기 때문에 더 빠릅니다. 문자열 구문 분석은 생각보다 느립니다.

나는 일반적으로 다음을 사용합니다.

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");

(물론, 문자열 리터럴이 아닌 "First"와 "Second"가 더 의미가 있습니다.)


AppendFormat ()은 AppendLine (String.Format ())보다 훨씬 읽기 쉽습니다.


이 구조를 선호합니다.

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

물론 줄 바꿈을 분리하기 위해 할 말이 있습니다.


Is it just positively awful to simply use

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

? I mean, I know it's not platform-independent or whatever, but in 9 out of 10 cases it gets the job done.

ReferenceURL : https://stackoverflow.com/questions/349724/when-do-you-use-stringbuilder-appendline-string-format-vs-stringbuilder-appendf

반응형