C#의 여러 줄 문자열 리터럴
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의 답변에 나와 있는 큰따옴표를 제외하고는 이 방법을 사용할 때 특수 문자를 이스케이프할 필요가 없습니다.
C#에서는 동사 문자열 리터럴이라고 하며, 리터럴 앞에 @를 붙이면 됩니다.이것은 여러 줄을 허용할 뿐만 아니라 탈출도 해제합니다.예를 들어, 다음과 같은 작업을 수행할 수 있습니다.
string query = @"SELECT foo, bar
FROM table
WHERE name = 'a\b'";
그러나 여기에는 문자열에 대한 줄 바꿈(소스에 있는 줄 바꿈을 사용)이 포함됩니다.SQL의 경우, 이것은 해롭지 않을 뿐만 아니라 문자열이 보이는 모든 곳에서 가독성을 향상시킬 수 있습니다. 하지만 다른 곳에서는 필요하지 않을 수도 있습니다. 이 경우 처음에 다중 행 동사 문자열 리터럴을 사용하지 않거나 결과 문자열에서 제거할 필요가 있습니다.
이중 따옴표를 사용하려면 이중 따옴표 기호를 추가해야 합니다.
string quote = @"Jon said, ""This will work,"" - and it did!";
참고로 C# 6.0에서는 보간된 문자열을 동사형 문자열 리터럴과 결합할 수 있습니다.
string camlCondition = $@"
<Where>
<Contains>
<FieldRef Name='Resource'/>
<Value Type='Text'>{(string)parameter}</Value>
</Contains>
</Where>";
문자열 리터럴을 사용할 때의 문제는 문자열 자체에 공백이 생기지 않도록 완전히 정렬된 상태로 두어야 하기 때문에 코드가 약간 이상하게 보일 수 있다는 것입니다.
var someString = @"The
quick
brown
fox...";
우웩.
따라서 모든 것을 코드의 나머지 부분에 맞게 유지하는 솔루션은 다음과 같습니다.
var someString = String.Join(
Environment.NewLine,
"The",
"quick",
"brown",
"fox...");
물론 SQL 문의 행을 논리적으로 분할하고 실제로 새 행이 필요하지 않은 경우에는 언제든지 대체할 수 있습니다.Environment.NewLine
위해서" "
.
다른 하나는 문자열 리터럴의 사용입니다.형식입니다. 이 경우 물결 괄호/괄호 '{' 및 '}'을(를) 이스케이프해야 합니다.
// 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)
왜 사람들은 문자열과 문자열 리터럴을 계속 혼동합니까?받아들여진 대답은 다른 질문에 대한 훌륭한 대답입니다. 이 질문에 대한 대답이 아닙니다.
저는 이것이 오래된 주제라는 것을 알지만, 저는 아마도 OP와 같은 질문을 가지고 이곳에 왔는데, 사람들이 어떻게 그것을 계속 잘못 읽는지 보는 것이 답답합니다.아니면 제가 잘못 읽고 있는 것일 수도 있습니다.
대략적으로 말하면 문자열은 프로그램 실행 중 텍스트 문자에 매핑될 수 있는 바이트 시퀀스를 포함하는 컴퓨터 메모리의 영역입니다.반면 문자열 리터럴은 아직 컴파일되지 않은 소스 코드의 한 부분으로, 나중에 문자열이 나타나는 프로그램을 실행하는 동안 문자열을 초기화하는 데 사용되는 값을 나타냅니다.
C#의 문장은...
string query = "SELECT foo, bar"
+ " FROM table"
+ " WHERE id = 42";
는 세 줄 문자열이 아니라 하나의 라이너를 생성합니다. 세 줄의 연결(각각 다른 리터럴에서 초기화됨) 중 어느 것도 새 줄 수정자를 포함하지 않습니다.
OP가 질문하는 것처럼 보이는 것은 - 적어도 내가 그 단어들로 질문하고 싶은 것은 - 컴파일된 문자열에서 소스 코드에서 발견된 것과 유사한 줄 바꿈을 도입하는 방법이 아니라 컴파일된 문자열에 브레이크를 도입하지 않고 소스 코드에서 텍스트의 긴 줄 바꿈을 명확하게 구분하는 방법입니다.그리고 긴 실행 시간을 요구하지 않고 소스 코드에서 나오는 여러 하위 문자열을 결합하는 데 소요됩니다.Javascript 또는 C++의 다중 행 문자열 리터럴 내에서 뒤에 오는 백슬래시와 같습니다.
문자열을 하는 것은 신경쓰지 , 말그로의문사용는것하것을마제안, 경쓰지신는하대자.StringBuilder
s,String.Join
s 않은 이해하지 . s 는 문 자 반 있 함 그 사 이 만 니 다 듭 지 생 게 하 각 있 고 다 못 고 하 하 해 제 로 대 질 문 을 이 또 들 열 함 수 람 는 은 않 전 이 렇 지 수 는 첩 와 중 ▁s ▁that ▁revers ▁with ▁are ▁nested ▁me ▁not ▁string아니면 제가 그것을 이해하지 못할 수도 있습니다.
제가 아는 한, C#은 (적어도 제가 지금까지 사용하고 있는 구석기 버전에서는, 이전 10년 동안) 실행이 아닌 컴파일 중에 해결할 수 있는 다중 문자열 리터럴을 깨끗하게 생성하는 기능이 없습니다.
현재 버전이 지원할 수도 있지만, 저는 현악기와 현악기 리터럴의 차이를 공유하고 싶습니다.
업데이트:
(MeowCat2012의 댓글에서) 할 수 있습니다.OP의 "+" 접근법이 최고입니다.사양에 따라 최적화가 보장됩니다. http://stackoverflow.com/a/288802/9399618
여러 줄 추가: @ 사용
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";
@ 및 "를 사용할 수 있습니다.
string sourse = @"{
""items"":[
{
""itemId"":0,
""name"":""item0""
},
{
""itemId"":1,
""name"":""item1""
}
]
}";
C# 11 [2022]에서는 Raw String 리터럴을 사용할 수 있습니다.원시 문자열 리터럴을 사용하면 이스케이프 시퀀스를 작성할 필요 없이 " 문자를 더 쉽게 사용할 수 있습니다.
운영을 위한 솔루션:
string query1 = """
SELECT foo, bar
FROM table
WHERE id = 42
""";
string query2 = """
SELECT foo, bar
FROM table
WHERE id = 42
and name = 'zoo'
and type = 'oversized "jumbo" grand'
""";
원시 문자열 리터럴에 대한 자세한 정보
자세한 내용은 원시 문자열 리터럴 GitHub 문제를 참조하십시오. 블로그 기사 C#11 미리보기 업데이트 – 원시 문자열 리터럴, UTF-8 등을 참조하십시오!
저는 이것을 본 적이 없기 때문에 여기에 올릴 것입니다(만약 당신이 문자열 전달에 관심이 있다면 이것도 할 수 있습니다).이 방법은 문자열을 여러 줄로 분할하고 원하는 방식으로 자신의 콘텐츠를 추가할 수 있다는 것입니다.여기서 "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
)";
}
예, 실제 문자열에 새 줄을 추가하지 않고 문자열을 여러 줄로 분할할 수 있지만, 다음과 같은 경우가 있습니다.
string s = $@"This string{
string.Empty} contains no newlines{
string.Empty} even though it is spread onto{
string.Empty} multiple lines.";
비결은 빈 것으로 평가되는 코드를 도입하는 것이며, 코드는 출력에 영향을 주지 않고 새 줄을 포함할 수 있습니다.저는 이 대답에서 비슷한 질문으로 이 접근법을 적용했습니다.
질문이 무엇인지에 대해 분명히 약간의 혼란이 있지만, 여기서 우리가 원하는 것은 새로운 줄 문자를 포함하지 않는 문자열 리터럴이며, 그 정의는 여러 줄에 걸쳐 있습니다.(댓글에서 그는 그렇게 말하고, "Here what I have"는 새 줄이 있는 문자열을 만들지 않는 코드를 보여줍니다.)
이 장치 테스트의 목적은 다음과 같습니다.
[TestMethod]
public void StringLiteralDoesNotContainSpaces()
{
string query = "hi"
+ "there";
Assert.AreEqual("hithere", query);
}
컴파일러에 의해 하나로 최적화되거나 최적화되지 않을 수 있는 두 문자열 리터럴의 연결 대신 하나의 문자열 리터럴이 되도록 쿼리의 위 정의를 변경합니다.
C++ 접근 방식은 각 행을 백슬래시로 종료하여 새 행 문자가 이스케이프되고 출력에 표시되지 않도록 하는 것입니다.안타깝게도 결과에 공백이 추가되지 않도록 첫 번째 줄 뒤의 각 줄을 정렬해야 하는 문제가 여전히 남아 있습니다.
발생하지 않을 수도 있는 컴파일러 최적화에 의존하지 않는 유일한 옵션은 정의를 한 줄에 놓는 것입니다.컴파일러 최적화에 의존하고 싶다면, 이미 가지고 있는 +가 좋습니다. 문자열을 왼쪽으로 정렬할 필요가 없고, 결과적으로 새로운 줄이 생성되지 않으며, 최적화를 기대하는 것은 단지 하나의 연산일 뿐입니다. 함수 호출이 없습니다.
공백/새 줄을 사용하지 않으려면 문자열 추가가 효과적인 것 같습니다.
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.
원하는 경우 위의 내용을 여기에서 실행할 수 있습니다.
using System;
namespace Demo {
class Program {
static void Main(string[] args) {
string str = @"Welcome User,
Kindly wait for the image to
load";
Console.WriteLine(str);
}
}
}
산출량
Welcome User,
Kindly wait for the image to
load
언급URL : https://stackoverflow.com/questions/1100260/multiline-string-literal-in-c-sharp
'it-source' 카테고리의 다른 글
Bash 배열에서 요소 제거 (0) | 2023.04.26 |
---|---|
Mongodb v4.0 트랜잭션, MongoError:트랜잭션 번호는 복제본 집합 구성원 또는 몽고에서만 허용됩니다. (0) | 2023.04.26 |
Git에 푸시 중 오류 코드 403을 반환합니다. HTTP 요청 실패 (0) | 2023.04.26 |
에뮬레이터 오류:이 AVD의 구성에 커널 파일이 없습니다. (0) | 2023.04.26 |
iOS 앱을 제출하기 위해 보관하려고 하면 프로비저닝 설정이 충돌하는 오류가 발생함 (0) | 2023.04.26 |