C #에서 여러 줄 문자열 리터럴을 만드는 쉬운 방법이 있습니까?
여기 내가 지금 가진 것입니다 :
string query = "SELECT foo, bar"
+ " FROM table"
+ " WHERE id = 42";
나는 PHP가 알고
<<<BLOCK
BLOCK;
C #에는 비슷한 것이 있습니까?
답변
@
a 앞에 있는 기호를 사용하여 완전 문자열 리터럴string
을 형성 할 수 있습니다 .
string query = @"SELECT foo, bar
FROM table
WHERE id = 42";
또한 특수 문자를 이스케이프 할 필요가 없습니다 , 당신은이 방법을 사용하면 존 소총의 대답과 같이 큰 따옴표를 제외하고.
답변
C #에서는 완전 문자열 리터럴 이라고하며 리터럴 앞에 @를 넣어야합니다. 이렇게하면 여러 줄이 허용 될뿐만 아니라 이스케이프 기능도 해제됩니다. 예를 들어 다음을 수행 할 수 있습니다.
string query = @"SELECT foo, bar
FROM table
WHERE name = 'a\b'";
그러나 여기에는 줄 바꿈 (소스에서 줄 바꿈을 사용하는 것 포함)이 문자열에 포함됩니다. SQL의 경우 무해 할뿐만 아니라 문자열을 볼 수있는 곳 어디에서나 가독성을 향상시킬 수 있습니다. 그러나 다른 곳에서는 필요하지 않을 수도 있습니다. 또는 결과 문자열에서 제거하십시오.
이스케이프의 유일한 비트는 큰 따옴표를 원한다면 여분의 큰 따옴표를 추가해야한다는 것입니다.
string quote = @"Jon said, ""This will work,"" - and it did!";
답변
내가 찾은 문자열 리터럴을 사용할 때의 문제점 은 문자열 자체에서 공백을 얻지 않기 위해 코드를 약간 ” 이상하게 ” 보일 수 있다는 것입니다 .
var someString = @"The
quick
brown
fox...";
왝.
따라서 내가 사용하고 싶은 솔루션은 나머지 코드와 잘 어울립니다.
var someString = String.Join(
Environment.NewLine,
"The",
"quick",
"brown",
"fox...");
당신은 당신이처럼 논리적으로 SQL 문의 라인을 분할 할 실제로 새로운 라인을 필요하지 않은 경우 그리고 물론, 당신은 언제나 대체 할 수 있습니다 Environment.NewLine
에 대한 " "
.
답변
주목해야 할 또 다른 방법은 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)
답변
부수적으로 C # 6.0에서는 보간 된 문자열을 그대로 문자열 리터럴과 결합 할 수 있습니다.
string camlCondition = $@"
<Where>
<Contains>
<FieldRef Name='Resource'/>
<Value Type='Text'>{(string)parameter}</Value>
</Contains>
</Where>";
답변
사람들이 문자열을 문자열 리터럴과 혼동하는 이유는 무엇입니까? 허용되는 답변은 다른 질문에 대한 훌륭한 답변입니다. 이건 아니야
나는 이것이 오래된 주제라는 것을 알고 있지만 OP와 동일한 질문으로 여기에 왔으며 사람들이 어떻게 그것을 오해하는지 보는 것은 실망 스럽습니다. 아니면 내가 잘못 읽고 있을지 모르겠다.
대략적으로 말하면, 문자열은 프로그램 실행 중에 텍스트 문자에 매핑 될 수있는 일련의 바이트를 포함하는 컴퓨터 메모리 영역입니다. 반면, 문자열 리터럴은 아직 컴파일되지 않은 소스 코드의 일부로, 문자열이 나타나는 프로그램을 실행하는 동안 나중에 문자열을 초기화하는 데 사용되는 값을 나타냅니다.
C #에서 진술은 …
string query = "SELECT foo, bar"
+ " FROM table"
+ " WHERE id = 42";
… 하지 않는 세 줄 문자열하지만 한 라이너를 생산; 세 개의 문자열 (각각 다른 리터럴에서 초기화 됨)의 연결은 개행 수정자를 포함하지 않습니다.
OP가 묻는 것-적어도 그 단어로 묻는 것-은 컴파일 된 문자열에서 소스 코드에서 찾은 것을 모방하는 줄 바꿈을 소개하는 방법이 아니라 명확성을 위해 오랫동안 끊는 방법입니다. , 컴파일 된 문자열에 줄 바꿈이 없는 소스 코드의 한 줄의 텍스트입니다 . 또한 실행 시간을 늘리지 않고도 소스 코드에서 나오는 여러 하위 문자열을 결합하는 데 소비했습니다. javascript 또는 C ++의 여러 줄 문자열 리터럴 내의 후행 백 슬래시와 같습니다.
그대로 사용하는 문자열, nevermind StringBuilder
, String.Join
s 또는 심지어 문자열 반전 기능이있는 중첩 함수 사용을 제안하면 사람들이 실제로 질문을 이해하지 못한다고 생각합니다. 아니면 내가 이해하지 못할 수도 있습니다.
내가 아는 한, C # (최소 10 년 전 여전히 사용중인 구석기 시대 버전에서는)은 실행이 아닌 컴파일 중에 해결할 수있는 여러 줄 문자열 리터럴 을 깨끗하게 생성하는 기능이 없습니다.
현재 버전이 지원할 수도 있지만 문자열과 문자열 리터럴 사이의 차이를 공유한다고 생각했습니다.
최신 정보:
(MeowCat2012의 의견에서) 가능합니다. OP의 “+”접근 방식이 가장 좋습니다. 사양에 따르면 최적화가 보장됩니다 : http://stackoverflow.com/a/288802/9399618
답변
나는 이것을 보지 못 했으므로 여기에 게시 할 것입니다 (문자열을 전달하는 데 관심이 있다면 이것을 할 수도 있습니다.) 아이디어는 문자열을 여러 줄로 나누고 자신의 내용을 추가 할 수 있다는 것입니다 (또한 원하는 방식으로 여러 줄에). 여기서 “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
)";
}