C # 6의 긴 문자열 보간 라인


134

기존 코드베이스의 문자열 형식 호출에 적용 할 때 문자열 보간이 실제로 좋지만 일반적으로 선호되는 열 제한을 고려하면 문자열이 한 줄에 비해 너무 길어집니다. 특히 보간되는 표현식이 복잡한 경우. 형식 문자열을 사용하면 여러 줄로 나눌 수있는 변수 목록이 있습니다.

var str = string.Format("some text {0} more text {1}",
    obj1.property,
    obj2.property);

누구 든지이 선을 깨는 선호하는 수단이 있습니까?

나는 당신이 다음과 같은 것을 할 수 있다고 생각합니다 :

var str = $"some text { obj1.property }" +
  " more text { obj2.property };

1
내 경험상 복잡한 표현의 보간을 피하는 것이 좋습니다. 이 경우 변수를 추출하십시오. 그렇게하면 문자열 안에 줄 바꿈이있는 곳을 나누면 일반적으로 잘 맞습니다.
markijbema

2
나는이 질문에 혼란 스럽다. 나는 단지 다음 $""과 같이 작동 하는 여러 줄을 원합니다@""
Panic Colony

2
Panic 대령, 질문은 긴 보간 라인을 분리하는 방법에 대해 묻기 때문에 문자열 리터럴 자체에 줄 바꿈을 도입하지 않고 열 너비 요구 사항을 위반하지 않습니다. $ @ ""는 훌륭하지만 그에 도입 된 줄 바꿈은 문자열 리터럴에 있습니다.
예레미야 고디

4
위험 : $"some text { obj1.property }" + " more text { obj2.property }";당신이 생각하는 것처럼 행동하지 않습니다. 해당 표현식의 처음 절반 만 보간 된 문자열입니다. 그런 다음 보간 되지 않은 문자열 리터럴 과 연결됩니다." more text { obj2.property }"
bacar

1
$ @에서 \ t \ r \ n을 지원하려면 stackoverflow.com/questions/51991713/…
M.Hassan

답변:


198

당신은 수있는 여러 라인으로 라인을 중단,하지만 난 더 이상 구문 외모의 좋은 말을하지 않을 것입니다.

$@보간 된 그대로의 문자열 을 사용하려면 구문을 사용해야 하며 다음 {...}과 같이 매개 변수 안에 개행을 넣을 수 있습니다 .

string s = $@"This is all {
    10
    } going to be one long {
    DateTime.Now
    } line.";

위의 문자열에는 줄 바꿈이 없으며 실제로 다음과 같은 내용이 있습니다.

이것은 모두 10 개의 긴 01.08.2015 23.49.47 라인이 될 것입니다.

(참고, 노르웨이어 형식)

이제, 나는 사용을 중단하지 않을 것이라고 말했다 string.Format. 제 생각에는 이러한 문자열 보간 표현식 중 일부는 실제로 좋아 보이지만 더 복잡한 표현식은 읽기가 매우 어려워지기 시작합니다. 를 사용하지 않으면 FormattableString코드가 String.Format어쨌든 호출로 컴파일 된다는 것을 고려할 때 , 나는 String.Format그것이 의미 가 있는 곳으로 계속 가야한다고 말합니다 .


확실한 대답. 나는 FormattableString또한 전화로 귀결됩니다 String.Format.
Alex Booker

8
이 답변을 통해 이와 정반대의 방법을 알아낼 수있었습니다. $@""구문 감사 합니다!
Bobson

@AlexBooker 그보다 더 복잡합니다. FormattableString.Invarian($"Hello {name}" + \n "are you the owner of {pet}?");보간 된 두 문자열을 하나의 간단한 문자열로 병합하기 때문에 수행 할 수 없습니다 .
ANeves

줄 바꿈과 탭은 보간 된 그대로의 문자열로 간주됩니다. C # 대화식 창에 다음을 입력하면 결과 문자열이 형식화됩니다. > var name = "Simon"; var templateName = "How to interpolate a verbatim string"; var now = DateTime.UtcNow;. var output = $@"Hi {name}, This template is a demo of {templateName}. It was ran at {now.ToString("o")}"; > output. 출력은"Hi Simon,\r\nThis template is a demo of How to interpolate a verbatim string.\r\n\r\nIt was ran at 2020-01-24T15:49:35.6678353Z"
Enzoaeneas

1
@Enzoaeneas 의견에서 형식 지원을 과대 평가했다고 생각하지만, 귀하가 말하는 것을 이해하고 동의합니다.
Lasse V. Karlsen

61

문자열 보간과 여러 줄 문자열 리터럴을 얻기 위해 결합 $하고 @함께 사용할 수 있습니다 .

var str = $@"some text { obj1.property }
     more text { obj2.property }";

그러나 그 NewLine사이에 캐릭터가 생길 것이므로 원하는 것이 아닐 수도 있습니다.


3
그러나 @가 실제로 줄 바꿈을 리터럴에 넣지 않습니까?
예레미야 고디

5
그렇습니다. 명시 적으로 말하도록 내 대답을 업데이트했습니다.
MarcinJuraszek

새 줄뿐만 아니라 새 줄의 초기 탭도 있습니다. $@"Visual Studio에서 사용할 때 실제 문자열 형식을 올바르게 표시 하려면 텍스트 편집기의 맨 왼쪽부터 새 줄을 시작해야합니다.
GDS

이 솔루션을 사용하면 및 \ n은 문자열의 예를 들어 \ 연구를 사용할 수 없습니다
요한 프란 젠

22

OP가 다른 것을 요구했지만이 질문을 읽는 많은 사람들이 다음과 같이 $""작동 하는 멀티 라인 보간 을 원할 것으로 기대 합니다 @"". 그렇게하려면$@""

$@"Height: {height}
Width: {width}
Background: {background}"

3
그는 출력에 줄 바꿈을 원하지 않고 코드 자체만으로 다른 줄을 감 쌉니다.
Martin Capodici

7
그는이 답변이 문자열 보간 구문을 사용하여 여러 줄 문자열을 수행하는 방법을 검색하는 대상을위한 것임을 분명히했습니다.
Brandon Bonds

2

이거 야:

var str = $"some text { obj1.property }" +
          $" more text { obj2.property }";

두 번째 주 $의를$"..." + $"..."


18
이렇게하면 String.Format을 두 번 호출하고 메모리에 세 개의 문자열 (Side A, Side B 및 A + B)을
만듭니다.

1
이렇게 FormattableString하면 연결된 문자열에 캐스트 를 사용할 수 있습니까?
binki

4
오늘날 많은 구현에서 Gb의 메모리가있는 GHz CPU에서 실행하면 추가 호출 및 추가 문자열로 성능 문제가 발생하지 않습니다. 예를 들어 O (n2) 알고리즘을 사용하면 성능 문제가 발생합니다. 이 사람을 공감하는 것은 불공평하다고 생각합니다.
Johan Franzén

1

재정의 된 ToString () 내에서 StringBuilder를 예로 사용했습니다.

    // return employee data
    public override string ToString()
    {
        StringBuilder buffer = new StringBuilder();
        buffer.AppendLine($"Number: {EmployeeNumber}");
        buffer.AppendLine($"Name: {EmployeeName}");
        buffer.AppendLine($"Address: {PostalAddress}");
        buffer.AppendLine($"Phone: {PhoneNumber}");
        buffer.AppendLine($"Age: {EmployeeAge}");
        buffer.AppendLine($"Gender: {EmployeeGender}");
        buffer.AppendLine($"Status: {EmployeeStatus}");
        buffer.AppendLine($"Manager: {EmployeeManager}");
        buffer.AppendLine($"Start: {EmployeeStartDate.ToShortDateString()}");
        return buffer.ToString();
    }

왜하지 buffer.AppendFormat("{0}Number: {1}", Environment.NewLine, EmployeeNumber);???
TS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.