etc./StackOverFlow

C#의 여러 줄 문자열 리터럴

청렴결백한 만능 재주꾼 2023. 5. 2. 22:10
반응형

질문자 :Chet


C#에서 여러 줄 문자열 리터럴을 만드는 쉬운 방법이 있습니까?

지금 가지고 있는 것은 다음과 같습니다.

 string query = "SELECT foo, bar" + " FROM table" + " WHERE id = 42";

PHP가 있다는 것을 알고 있습니다.

 <<<BLOCK BLOCK;

C#에 비슷한 것이 있습니까?



string @ 기호를 사용하여 그대로 문자열 리터럴 을 형성할 수 있습니다.

 string query = @"SELECT foo, bar FROM table WHERE id = 42";

또한 Jon Skeet의 답변에 표시된 것처럼 큰따옴표를 제외하고 이 방법을 사용할 때 특수 문자를 이스케이프할 필요가 없습니다.


John Rasch

C#에서는 그대로 문자열 리터럴 이라고 하며 리터럴 앞에 @를 붙이면 됩니다. 이것은 여러 줄을 허용할 뿐만 아니라 이스케이프도 끕니다. 예를 들어 다음을 수행할 수 있습니다.

 string query = @"SELECT foo, bar FROM table WHERE name = 'a\b'";

그러나 여기에는 줄 바꿈(소스에 있는 줄 바꿈 사용)이 문자열에 포함됩니다. SQL의 경우 이는 무해할 뿐만 아니라 문자열을 보는 모든 곳에서 가독성을 향상시킬 수 있습니다. 그러나 다른 곳에서는 필요하지 않을 수 있습니다. 또는 결과 문자열에서 제거하십시오.

이스케이프의 유일한 비트는 큰따옴표를 원하면 여분의 큰따옴표 기호를 추가해야 한다는 것입니다.

 string quote = @"Jon said, ""This will work,"" - and it did!";

Jon Skeet

참고로 C# 6.0에서는 이제 보간된 문자열을 그대로 문자열 리터럴과 결합할 수 있습니다.

 string camlCondition = $@" <Where> <Contains> <FieldRef Name='Resource'/> <Value Type='Text'>{(string)parameter}</Value> </Contains> </Where>";

Riegardt Steyn

문자열 리터럴을 사용할 때의 문제는 문자열 자체에 공백이 없도록 하려면 완전히 왼쪽 정렬되어야 하기 때문에 코드가 약간 "이상하게 보일 수 있다는 것입니다.

 var someString = @"The quick brown fox...";

왝.

따라서 내가 사용하고 싶은 솔루션은 나머지 코드와 모든 것이 잘 정렬되도록 유지하는 것입니다.

 var someString = String.Join( Environment.NewLine, "The", "quick", "brown", "fox...");

그리고 물론, SQL 문의 줄을 논리적으로 분리하고 실제로 줄 바꿈이 필요하지 않은 경우 항상 " " Environment.NewLine 을 사용할 수 있습니다.


dav_i

주의해야 할 또 다른 문제는 string.Format에서 문자열 리터럴을 사용하는 것입니다. 이 경우 중괄호/대괄호 '{' 및 '}'를 이스케이프해야 합니다.

 // this would give a format exception string.Format(@"<script> function test(x) { return x * {0} } </script>", aMagicValue) // this contrived example would work string.Format(@"<script> function test(x) {{ return x * {0} }} </script>", aMagicValue)

Martin Clarke

사람들이 문자열을 문자열 리터럴과 혼동하는 이유는 무엇입니까? 허용된 답변은 다른 질문에 대한 훌륭한 답변입니다. 이 사람이 아닙니다.

나는 이것이 오래된 주제라는 것을 알고 있지만 아마도 OP와 같은 질문으로 여기에 왔으며 사람들이 어떻게 그것을 계속 잘못 읽는지 보는 것은 실망 스럽습니다. 아니면 제가 잘못 읽고 있는 것인지도 모르겠습니다.

대략적으로 말하면 문자열은 프로그램 실행 중에 텍스트 문자에 매핑할 수 있는 바이트 시퀀스를 포함하는 컴퓨터 메모리 영역입니다. 반면에 문자열 리터럴은 나중에 표시되는 프로그램 실행 중에 문자열을 초기화하는 데 사용되는 값을 나타내는 아직 컴파일되지 않은 소스 코드입니다.

C#에서 명령문은 ...

 string query = "SELECT foo, bar" + " FROM table" + " WHERE id = 42";

... 세 줄 문자열하지만 한 라이너를 생성하지 않습니다; 개행 수정자를 포함하지 않는 세 개의 문자열(각각 다른 리터럴에서 초기화됨)의 연결.

OP가 묻는 것처럼 보이는 것은 -적어도 그 단어로 묻고 싶은 것은 - 컴파일된 문자열에서 소스 코드에서 찾은 줄 바꿈을 모방하는 줄 바꿈을 도입하는 방법이 아니라 명확성을 위해 긴 줄 바꿈을 도입하는 방법입니다. , 컴파일된 문자열에 중단을 도입 하지 않고 소스 코드의 텍스트 한 줄. 그리고 확장된 실행 시간을 요구하지 않고 소스 코드에서 오는 여러 하위 문자열을 결합하는 데 소비했습니다. 자바스크립트 또는 C++에서 여러 줄 문자열 리터럴 내의 후행 백슬래시와 같습니다.

StringBuilder , String.Join 또는 문자열 반전이 있는 중첩 함수의 사용을 제안하는 것은 사람들이 실제로 질문을 이해하지 못한다고 생각하게 만듭니다. 아니면 내가 이해하지 못하는 것일 수도 있습니다.

내가 아는 한, C#에는 (적어도 이전 10년 동안 여전히 사용하고 있는 구석기 버전에서는) 실행이 아닌 컴파일 중에 해결할 수 있는 여러 줄 문자열 리터럴을 깔끔하게 생성하는 기능이 없습니다.

아마도 현재 버전이 그것을 지원할 수도 있지만, 나는 문자열과 문자열 리터럴 사이에 내가 인지하는 차이점을 공유할 것이라고 생각했습니다.

업데이트:

(MeowCat2012의 댓글에서) 할 수 있습니다. OP의 "+"접근 방식이 가장 좋습니다. 사양에 따르면 최적화가 보장됩니다. http://stackoverflow.com/a/288802/9399618


Carvo Loco

여러 줄 추가: @ 사용

 string query = @"SELECT foo, bar FROM table WHERE id = 42";

중간에 문자열 값 추가 : $ 사용

 string text ="beer"; string query = $"SELECT foo {text} bar ";

여러 줄 문자열 가운데에 값 추가: $@ 사용

 string text ="Customer"; string query = $@"SELECT foo, bar FROM {text}Table WHERE id = 42";

Isanka Thalagala

@"" 를 사용할 수 있습니다.

 string sourse = @"{ ""items"":[ { ""itemId"":0, ""name"":""item0"" }, { ""itemId"":1, ""name"":""item1"" } ] }";

vovkas

나는 이것을 보지 못했기 때문에 여기에 게시할 것입니다(문자열 전달에 관심이 있다면 이것도 할 수 있습니다.) 아이디어는 문자열을 여러 줄로 나누고 자신의 콘텐츠를 추가할 수 있다는 것입니다(또한 여러 줄에) 원하는 방식으로. 여기서 "tableName"은 문자열로 전달될 수 있습니다.

 private string createTableQuery = ""; void createTable(string tableName) { createTableQuery = @"CREATE TABLE IF NOT EXISTS ["+ tableName + @"] ( [ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, [Key] NVARCHAR(2048) NULL, [Value] VARCHAR(2048) NULL )"; }

RobertHana

예, 실제 문자열에 줄 바꿈을 추가하지 않고 문자열을 여러 줄로 분할할 수 있지만 예쁘지는 않습니다.

 string s = $@"This string{ string.Empty} contains no newlines{ string.Empty} even though it is spread onto{ string.Empty} multiple lines.";

트릭은 비어 있는 것으로 평가되는 코드를 도입하는 것이며 해당 코드는 출력에 영향을 주지 않고 줄 바꿈을 포함할 수 있습니다. 이 답변 에서 비슷한 질문으로 이 접근 방식을 적용했습니다.

질문이 무엇인지에 대해서는 분명히 약간의 혼란이 있지만 여기서 우리가 원하는 것은 줄 바꿈 문자를 포함하지 않는 문자열 리터럴이며 정의가 여러 줄에 걸쳐 있다는 두 가지 힌트가 있습니다. (주석에서 그는 그렇게 말하고 "여기에 내가 가진 것이 있습니다"는 줄 바꿈이 포함된 문자열을 생성하지 않는 코드를 보여줍니다)

이 단위 테스트는 의도를 보여줍니다.

 [TestMethod] public void StringLiteralDoesNotContainSpaces() { string query = "hi" + "there"; Assert.AreEqual("hithere", query); }

컴파일러에 의해 최적화되거나 최적화되지 않을 수 있는 두 개의 문자열 리터럴을 연결하는 대신 하나의 문자열 리터럴이 되도록 위의 쿼리 정의를 변경하십시오.

C++ 접근 방식은 각 줄을 백슬래시로 끝내면 줄 바꿈 문자가 이스케이프되어 출력에 나타나지 않습니다. 불행히도 결과에 추가 공백을 추가하지 않으려면 첫 번째 줄 이후의 각 줄을 왼쪽 정렬해야 하는 문제가 여전히 있습니다.

일어나지 않을 수도 있는 컴파일러 최적화에 의존하지 않는 옵션은 한 줄에 정의를 넣는 것뿐입니다. 컴파일러 최적화에 의존하고 싶다면 이미 가지고 있는 +가 좋습니다. 문자열을 왼쪽 정렬할 필요가 없고 결과에 줄 바꿈이 표시되지 않으며 최적화를 기대하기 위해 함수 호출 없이 한 번만 수행하면 됩니다.


TamaMcGlinn

공백/줄 바꿈을 원하지 않으면 문자열 추가가 작동하는 것 같습니다.

 var myString = String.Format( "hello " + "world" + " i am {0}" + " and I like {1}.", animalType, animalPreferenceType ); // hello world i am a pony and I like other ponies.

원한다면 여기 에서 위를 실행할 수 있습니다.


rattray

출처 : http:www.stackoverflow.com/questions/1100260/multiline-string-literal-in-c-sharp

반응형