C #에서 여러 줄 문자열 리터럴을 만드는 쉬운 방법이 있습니까?
여기 내가 지금 가진 것입니다 :
string query = "SELECT foo, bar"
+ " FROM table"
+ " WHERE id = 42";
나는 PHP가 알고
<<<BLOCK
BLOCK;
C #에는 비슷한 것이 있습니까?
42
SQL 주입을 피하기 위해 특히 사용자 입력에서 오는 경우 매개 변수로 매개 변수 바인딩을 고려해야합니다 .
C #에서 여러 줄 문자열 리터럴을 만드는 쉬운 방법이 있습니까?
여기 내가 지금 가진 것입니다 :
string query = "SELECT foo, bar"
+ " FROM table"
+ " WHERE id = 42";
나는 PHP가 알고
<<<BLOCK
BLOCK;
C #에는 비슷한 것이 있습니까?
42
SQL 주입을 피하기 위해 특히 사용자 입력에서 오는 경우 매개 변수로 매개 변수 바인딩을 고려해야합니다 .
답변:
@
a 앞에 있는 기호를 사용하여 완전 문자열 리터럴string
을 형성 할 수 있습니다 .
string query = @"SELECT foo, bar
FROM table
WHERE id = 42";
또한 특수 문자를 이스케이프 할 필요가 없습니다 , 당신은이 방법을 사용하면 존 소총의 대답과 같이 큰 따옴표를 제외하고.
@"my string".Replace(Environment.NewLine, "")
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>";
$@"{{example literal text { fooString }. }}"
늘려야 한다고 가정합니다. 예를 들어 Angular, React 및 Vue.js가 반대 규칙을 사용하기 때문에 일부가 혼동 될 수 있습니다.
사람들이 문자열을 문자열 리터럴과 혼동하는 이유는 무엇입니까? 허용되는 답변은 다른 질문에 대한 훌륭한 답변입니다. 이건 아니야
나는 이것이 오래된 주제라는 것을 알고 있지만 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
)";
}
createTable("MyTable");
OP의 질문은 코드에 직접 여러 줄 문자열 리터럴을 입력하는 방법에 관한 것 데이터베이스 쿼리 자체를 구성하는 방법이 아닙니다. :)
그렇습니다. 실제 문자열에 줄 바꿈을 넣지 않고도 문자열을 여러 줄로 나눌 수 있지만 꽤 예쁘지 않습니다.
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 ++ 접근 방식은 각 줄을 백 슬래시로 끝내서 줄 바꿈 문자가 이스케이프되어 출력에 나타나지 않게하는 것입니다. 불행히도 결과에 공백을 추가하지 않으려면 첫 번째 줄 이후의 각 줄을 정렬 해야하는 문제가 여전히 있습니다.
발생하지 않을 수있는 컴파일러 최적화에 의존하지 않는 하나의 옵션 만 있습니다. 즉, 정의를 한 줄에 두는 것입니다. 컴파일러 최적화에 의존하고 싶다면 이미 가지고있는 +가 훌륭합니다. 문자열을 왼쪽 정렬 할 필요가 없으며 결과에 줄 바꿈이 없으며 최적화를 기대하기 위해 함수 호출이없는 하나의 작업 일뿐입니다.
여러 줄 추가 : @ 사용
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";
공백 / 줄 바꿈을 원하지 않으면 문자열 추가가 작동하는 것 같습니다.
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.
당신은 위의 실행 여기에 만약 당신이 좋아하면.
나는 파티에 조금 늦었다는 것을 알고 있지만 이 스레드의 미래 독자에게 https://www.buildmystring.com/ 을 추천하고 싶습니다 . 이 사이트를 사용하여 모든 코드를 C # 문자열 리터럴로 변환 할 수 있습니다.
이 두 가지 방법을 사용할 수 있습니다.
private static String ReverseString(String str)
{
int word_length = 0;
String result = "";
for (int i = 0; i < str.Length; i++)
{
if (str[i] == ' ')
{
result = " " + result;
word_length = 0;
}
else
{
result = result.Insert(word_length, str[i].ToString());
word_length++;
}
}
return result;
}
//NASSIM LOUCHANI
public static string SplitLineToMultiline(string input, int rowLength)
{
StringBuilder result = new StringBuilder();
StringBuilder line = new StringBuilder();
Stack<string> stack = new Stack<string>(ReverseString(input).Split(' '));
while (stack.Count > 0)
{
var word = stack.Pop();
if (word.Length > rowLength)
{
string head = word.Substring(0, rowLength);
string tail = word.Substring(rowLength);
word = head;
stack.Push(tail);
}
if (line.Length + word.Length > rowLength)
{
result.AppendLine(line.ToString());
line.Clear();
}
line.Append(word + " ");
}
result.Append(line);
return result.ToString();
}
SplitLineToMultiline ()에서 사용하려는 문자열과 행 길이를 정의해야합니다. 매우 간단합니다. 감사합니다 .