문자열 리터럴에 개행을 삽입하는 방법은 무엇입니까?


155

.NET에서 둘 다 \r또는 \n문자열 리터럴을 제공 할 수 있지만 Environment.NewLine정적 속성 과 같은 "새 줄"특수 문자를 삽입하는 방법이 있습니까?


9
질문이 무엇입니까?
iburlakov

답변:


319

간단한 옵션은 다음과 같습니다.

  • string.Format:

    string x = string.Format("first line{0}second line", Environment.NewLine);
  • 문자열 연결 :

    string x = "first line" + Environment.NewLine + "second line";
  • 문자열 보간 (C # 6 이상) :

    string x = $"first line{Environment.NewLine}second line";

어디서나 \ n을 사용하고 다음을 대체 할 수 있습니다.

string x = "first line\nsecond line\nthird line".Replace("\n",
                                                         Environment.NewLine);

실행시에만 값을 사용할 수 있으므로이 값을 문자열 상수로 만들 수 없습니다 Environment.NewLine.


1
글쎄, 물론 감사하지만 Environment.NewLine을 사용하지 않는 것을 의미했습니다. 내 질문은 '/ newline'리터럴이 있는지였습니다.
Captain Comic

2
@Captain : 왜 피하고 Environment.NewLine싶습니까? 반대로, 그것을 사용하는 것이 좋습니다
abatishchev

18
@ abatishchev : 어떤 곳에서는 좋은 연습입니다. 내 다른 사람들에게는 그렇지 않습니다. 플랫폼에 맞는 것을 사용해야한다는 사실을 알아야합니다. 예를 들어, 라인 터미네이터 자체를 정의해야하는 네트워크 프로토콜을 사용하는 경우 좋지 않습니다 .
Jon Skeet

1
만화 @Captain : 내 마지막 문장은 문자 그대로 탈출 할 수없는 이유를 설명 -이 때문에 당신이 문자열 상수에 대한 메타 데이터에 포함 할 수 없는 상수 값입니다.
Jon Skeet

1
네, 두 가지 옵션을 모두 꺼려 할 수도 있습니다. 플러스 연산자를 사용하는 방법과 형식 방법을 사용하는 방법 중 하나는 '\ newline'리터럴을 주입하는 것이 가장 빠른 방법입니다. 그러나 Jon이 말했듯이 NewLine 리터럴이 존재한다면 동적이고 플랫폼에 의존해야합니다.
Captain Comic

33

Environment.NewLine을 포함하는 const 문자열을 원하면 다음과 같이 할 수 있습니다.

const string stringWithNewLine =
@"first line
second line
third line";

편집하다

이것은 const 문자열에 있기 때문에 컴파일 타임에 수행되므로 컴파일러는 개행을 해석합니다. 이 동작을 설명하는 참조를 찾을 수 없지만 의도 한대로 작동 함을 증명할 수 있습니다. 나는이 코드를 Windows와 Ubuntu (모노 포함)에서 컴파일 한 다음 분해하고 결과는 다음과 같습니다.

Windows에서 분해 우분투에서 분해

보시다시피, Windows에서 줄 바꿈은 \ r \ n으로, 우분투에서는 \ n으로 해석됩니다.


1
컴파일러는 텍스트의 각 줄 사이에 Environment.NewLine을 자동으로 추가합니다. 따라서 문자열은 다음과 같이 해석됩니다 : "first line"+ Environment.NewLine + "second line"+ Environment.NewLine + "third line"
Tal Jerome

3
+1 문자열 리터럴에 개행을 삽입하는 알려진 방법은 거의 없습니다. 지정한 동작에 대한 참조가 있습니까? 실제로 Environment.NewLine입니까, 아니면 개행의 컴파일러 정의입니까?
절망의 그리 모

1
코드 편집기의 개행 문자가 삽입되지 않았습니까? Windows에서 해당 코드를 편집기에 복사하여 붙여 넣으면 \ r \ n으로 변환 될 수 있습니다. 유닉스 계열의 플랫폼에서도 똑같이하면 아마도 \ n으로 변환 될 것이다.
Xiyng

이것으로 조심하십시오. CI / CD 서버 (예 : Teamcity, 서버 측 체크 아웃)에서 코드를 체크 아웃하면 CRLF가 LF로 변경되고 문자열에 줄 바꿈이 없습니다.
Leszek P

13
var sb = new StringBuilder();
sb.Append(first);
sb.AppendLine(); // which is equal to Append(Environment.NewLine);
sb.Append(second);
return sb.ToString();

2
first + Environment.NewLine + second더 효율적이고 (IMO) 더 읽기 쉬운 것을 사용 하는 대신 왜 이렇게 하시겠습니까?
Jon Skeet

@ 존 : 더 효율적입니까? 나는 String.Format한 번에 1 개의 문자열을 생성 할 것이라고 생각 했지만 (문화적 연결 등으로 인해 내부적으로 약간 느립니다) 문자열 연결-1 결과 + 1 임시, 맞습니까?
abatishchev

1
@abatishchev : 컴파일러는 str + str + str를로 변환하여 String.Concatenate출력 문자열 하나만 직접 빌드합니다 (IIRC, 문자열이 리터럴 인 경우 연결은 컴파일러에서 수행됨
Richard

@Richard : 즉 성능에 따라 여러 줄이지 만 한 줄로 된 문자열 연결 ( "a"+b+"c"+d등)은 단일 줄과 동일합니까? 아니면 그냥로 변환 String.Concatenate(a,b,c,d,etc)합니까?
abatishchev

@ abatishchev : 그것이 string.Format의견에서 제안하지 않은 이유 입니다. 컴파일러는을 호출하기 때문에 문자열 연결은 임시 문자열을 생성하지 않습니다 string.Concat(first, Environment.NewLine, second).
Jon Skeet

3

형식 문자열에서 Environment.NewLine을 편리하게 배치하는 또 다른 방법입니다. 아이디어는 문자열을 평소와 같이 형식화하지만 텍스트의 {nl}을 Environment.NewLine으로 대체하는 문자열 확장 메소드를 작성하는 것입니다.

용법

   " X={0} {nl} Y={1}{nl} X+Y={2}".FormatIt(1, 2, 1+2);
   gives:
    X=1
    Y=2
    X+Y=3

암호

    ///<summary>
    /// Use "string".FormatIt(...) instead of string.Format("string, ...)
    /// Use {nl} in text to insert Environment.NewLine 
    ///</summary>
    ///<exception cref="ArgumentNullException">If format is null</exception>
    [StringFormatMethod("format")]
    public static string FormatIt(this string format, params object[] args)
    {
        if (format == null) throw new ArgumentNullException("format");

        return string.Format(format.Replace("{nl}", Environment.NewLine), args);
    }

노트

  1. ReSharper에서 매개 변수를 강조 표시하려면 위의 방법에 속성을 추가하십시오.

    [StringFormatMethod ( "format")]

  2. 이 구현은 단순히 String.Format보다 효율적이지 않습니다.

  3. 아마도이 질문에 관심이있는 사람은 다음 질문에도 관심이있을 것 입니다 .C #의 명명 된 문자열 형식


2
string myText =
    @"<div class=""firstLine""></div>
      <div class=""secondLine""></div>
      <div class=""thirdLine""></div>";

그것은 아닙니다 :

string myText =
@"<div class=\"firstLine\"></div>
  <div class=\"secondLine\"></div>
  <div class=\"thirdLine\"></div>";

1
static class MyClass
{
   public const string NewLine="\n";
}

string x = "first line" + MyClass.NewLine + "second line"

3
-1 : 시스템이 이미 정의했습니다 Environment.NewLine. 다른 답변을 참조하십시오.
Richard

@ 리차드 : OP, 지금까지 내가 그를 이해할 수로, 즉 인라인 문자열 리터럴을 사용하고 싶어const string
abatishchev

@Richard Environment.NewLine은 정적이 아닙니다

1

최신 .net 버전에서는 리터럴 앞에 $를 사용하여 다음과 같이 변수를 사용할 수 있습니다.

var x = $"Line 1{Environment.NewLine}Line 2{Environment.NewLine}Line 3";

1
약간의 맥락은 나쁘지 않을 것입니다.
croxy

1
이것은 질문에 대한 답변을 제공하지 않습니다. 평판 이 충분 하면 모든 게시물댓글 수 있습니다 . 대신 asker의 설명이 필요없는 답변을 제공하십시오 . - 리뷰에서
H. Pauwelyn

@ H.Pauwelyn ツ : 피드백 Thx. 나는 약간의 맥락을 추가했다. 내 관점에서 솔루션은 확실히 질문에 대답합니다.
DanielK

0

New Line 문자열을 상수로 사용하려면 다음과 같이하십시오.

public readonly string myVar = Environment.NewLine;

C #에서 readonly 키워드의 사용자는이 변수를 한 번만 지정할 수 있음을 의미합니다. 여기 에서 설명서를 찾을 수 있습니다 . 실행 시간까지 값을 알 수없는 상수 변수를 선언 할 수 있습니다.


0

나는 "파이 토닉 방식"을 더 좋아한다

List<string> lines = new List<string> {
    "line1",
    "line2",
    String.Format("{0} - {1} | {2}", 
        someVar,
        othervar, 
        thirdVar
    )
};

if(foo)
    lines.Add("line3");

return String.Join(Environment.NewLine, lines);

0

웹 애플리케이션으로 작업중인 경우이를 시도 할 수 있습니다.

StringBuilder sb = new StringBuilder();
sb.AppendLine("Some text with line one");
sb.AppendLine("Some mpre text with line two");
MyLabel.Text = sb.ToString().Replace(Environment.NewLine, "<br />")

0

내가 질문을 이해하면 : "\r\n"아래의 새로운 줄을 얻으려면 커플 textbox. 내 예는 효과가 있었다-

   string s1 = comboBox1.Text;     // s1 is the variable assigned to box 1, etc.
   string s2 = comboBox2.Text;

   string both = s1 + "\r\n" + s2;
   textBox1.Text = both;

일반적인 대답은 정의 된 유형 스타일을 사용 s1 s2 하는 것일 수 있습니다 text box.


-1

여기서는 Environment.NewLine이 작동하지 않습니다.

내가 넣어 " < BR / > "문자열과 일했다.

전의:

ltrYourLiteral.Text = "첫 번째 줄 <. BR / > 두 번째 줄.";

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.