문자열 보간과 문자열 형식


113

문자열 보간 사용 사이에 눈에 띄는 성능 차이가 있습니까?

myString += $"{x:x2}";

대 String.Format ()?

myString += String.Format("{0:x2}", x);

Resharper가 수정을 요청하고 있기 때문에 요청하고 있으며 이전에 속아 본 적이 있습니다.


4
두 가지를 모두 시도해보고 차이가 있는지 확인하십시오.
Blorgbeard는

57
@Blorgbeard 솔직히 나는 게으르다. 그리고 나는 당신 중 한 사람이 대답을 직접 알면 시간이 덜 걸릴 것이라고 생각합니다.
Krythic

26
나는 처음이 질문을했을 때 망각으로 낙선되었고 2 년 후, 최대 +21이 된 것을 좋아합니다.
Krythic

46
진지하게. 이 질문의 유용성을 어떻게 의심 할 수 있습니까? 이 질문을하는 모든 사람이 '스스로 시도해보아야한다'고한다면 인간 시간 의 총 낭비 를 상상할 수 있습니까 ? 5 분 밖에 걸리지 않더라도 지금까지이 질문을 본 10,000 명 이상의 개발자에게 곱하십시오. 그리고 동료가 당신의 결과를 의심 할 때 어떻게합니까? 다시 한 번? 아니면 그냥이 SO 게시물을 참조하십시오. 그것은 그것이 거기에있는 일종의 것입니다.
BTownTKD

8
@BTownTKD 이것이 일반적인 Stackoverflow 동작입니다. 누군가가 의도 된 목적으로 사이트를 사용하면 즉시 소외됩니다. 이것은 또한 우리가 계정을 집단적으로 금지 할 수 있어야한다고 생각하는 이유 중 하나입니다. 많은 사람들이이 사이트에있을 자격이 없습니다.
Krythic 2017 년

답변:


72

주목할만한 것은 상대적입니다. 그러나 문자열 보간은 string.Format()컴파일 타임에 변환되므로 동일한 결과를 얻게됩니다.

그러나 미묘한 차이가 있습니다. 질문 에서 알 수 있듯이 형식 지정자의 문자열 연결로 인해 추가 string.Concat()호출이 발생합니다.


4
실제로 문자열 보간은 어떤 경우 (예 : a int가 사용되는 경우) 문자열 연결로 컴파일 될 수 있습니다. var a = "hello"; var b = $"{a} world";문자열 연결로 컴파일됩니다. var a = "hello"; var b = $"{a} world {1}";문자열 형식으로 컴파일됩니다.
Omar Muscatello

5

문자열 보간은 컴파일 타임에 string.Format ()으로 바뀝니다.

또한 string.Format에서 단일 인수에 대해 여러 출력을 지정하고 단일 인수에 대해 다른 출력 형식을 지정할 수 있습니다. 그러나 문자열 보간은 더 읽기 쉽습니다. 그래서 그것은 당신에게 달려 있습니다.

a = string.Format("Due date is {0:M/d/yy} at {0:h:mm}", someComplexObject.someObject.someProperty);

b = $"Due date is {someComplexObject.someObject.someProperty:M/d/yy} at {someComplexObject.someObject.someProperty:h:mm}";

몇 가지 성능 테스트 결과가 있습니다 https://koukia.ca/string-interpolation-vs-string-format-string-concat-and-string-builder-performance-benchmarks-c1dad38032a


2
문자열 보간입니다 단지 가끔 로 바뀌 String::Format. 때로는 String::Concat. 그리고 그 페이지의 성능 테스트는 실제로 의미가 없습니다. 각 메소드에 전달하는 인수의 양은 종속적입니다. concat이 항상 가장 빠른 것은 아니며 stringbuilder가 항상 가장 느린 것은 아닙니다.
Matthias Burger

3

문제는 성능에 관한 것이지만 제목에 "vs"라고만 적혀 있으므로 몇 가지 사항을 더 추가해야한다고 생각합니다. 일부는 의견이 있습니다.

  • 현지화

    • 인라인 코드 특성으로 인해 문자열 보간을 현지화 할 수 없습니다. 현지화하기 전에 string.Format. 그러나이를위한 도구가 있습니다 (예 :) ReSharper.
  • 유지 보수 가능성 (내 의견)

    • string.Format예를 들어 멋지고 의미있는 오류 메시지를 생성 할 때 내가 표현하고 싶은 문장에 초점을 맞추기 때문에 훨씬 더 읽기 쉽습니다. {N}자리 표시자를 사용하면 더 많은 유연성을 얻을 수 있으며 나중에 수정하기가 더 쉽습니다.
    • 또한 인터 플로 레이션의 인라인 형식 지정자는 잘못 읽기 쉽고 변경 중에 식과 함께 삭제하기 쉽습니다.
    • 복잡하고 긴 표현식을 사용할 때 보간은 빠르게 읽고 유지하기가 훨씬 더 어려워 지므로 이러한 의미에서 코드가 발전하고 더 복잡해질 때 제대로 확장되지 않습니다. string.Format이것에 훨씬 덜 취약합니다.
    • 하루의 끝에서이 모든 문제의 분리에 관하여 : 나는 혼합하지 좋아해요 가 제시하는 방법 으로 제시해야하는지 .

그래서 이것들을 기반으로 string.Format대부분의 코드 를 고수하기로 결정했습니다 . 하지만 더 유창하게 코딩 할 수 있도록 확장 방법을 준비했습니다 . 확장 프로그램의 구현은 한 줄로되어 있으며 사용중인 것처럼 보입니다.

var myErrorMessage = "Value must be less than {0:0.00} for field {1}".FormatWith(maximum, fieldName);

보간은 훌륭한 기능입니다. 오해하지 마십시오. 그러나 IMO는 string.FormatJavaScript와 같은 유사한 기능 을 놓친 언어에서 가장 빛납니다 .


추가 해주셔서 감사합니다.
Krythic

1
유지 관리에 동의하지 않습니다. ReSharper가 부여되면 삽입 된 값을 해당 인덱스와 일치시키는 것이 다소 쉬워 지지만 (그 반대의 경우도 마찬가지 임) {3}특히 형식을 재정렬하기 시작하는 경우 X인지 Y 인지 알아내는 것이 여전히인지 적 부하라고 생각 합니다. Madlibs 예 : $"It was a {adjective} day in {month} when I {didSomething}"string.Format("It was a {0} day in {1} when I {2}", adjective, month, didSomething)-> $"I {didSomething} on a {adjective} {month} day"string.Format("I {2} on a {0} {1} day", adjective, month, didSomething)
drzaus

@drzaus 의견을 공유해 주셔서 감사합니다. 좋은 점이 있지만 간단하고 이름이 좋은 지역 변수 만 사용하는 경우에만 사실입니다. 내가 꽤 많이 본 것은 보간 된 문자열에 넣은 복잡한 표현식, 함수 호출입니다. 으로 string.Format내가 생각하는 당신은 훨씬 적은 경향이 문제입니다. 그러나 어쨌든, 이것이 내가 그것이 내 의견이라고 강조한 이유입니다. :)
Zoltán Tamási
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.