Che*_*het 962 c# string shorthand
有没有一种简单的方法在C#中创建多行字符串文字?
这就是我现在拥有的:
string query = "SELECT foo, bar"
+ " FROM table"
+ " WHERE id = 42";
Run Code Online (Sandbox Code Playgroud)
我知道PHP有
<<<BLOCK
BLOCK;
Run Code Online (Sandbox Code Playgroud)
C#有类似的东西吗?
Joh*_*sch 1476
您可以使用@a前面的符号string来形成逐字字符串文字:
string query = @"SELECT foo, bar
FROM table
WHERE id = 42";
Run Code Online (Sandbox Code Playgroud)
使用此方法时,您也不必转义特殊字符,但Jon Skeet的答案中显示的双引号除外.
Jon*_*eet 528
它在C#中被称为逐字字符串文字,它只是在文字之前放置@的问题.这不仅允许多行,而且还会关闭转义.例如,您可以这样做:
string query = @"SELECT foo, bar
FROM table
WHERE name = 'a\b'";
Run Code Online (Sandbox Code Playgroud)
逃脱的唯一一点是,如果你想要一个双引号,你必须添加一个额外的双引号符号:
string quote = @"Jon said, ""This will work,"" - and it did!";
Run Code Online (Sandbox Code Playgroud)
Mar*_*rke 103
另一个需要注意的是在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)
Run Code Online (Sandbox Code Playgroud)
dav*_*v_i 96
我发现使用字符串文字的问题是它可以使你的代码看起来有点" 怪异 ",因为为了不在字符串本身中获取空格,它必须完全左对齐:
var someString = @"The
quick
brown
fox...";
Run Code Online (Sandbox Code Playgroud)
呸.
因此,我喜欢使用的解决方案是:它使所有内容与代码的其余部分保持良好对齐:
var someString = String.Join(
Environment.NewLine,
"The",
"quick",
"brown",
"fox...");
Run Code Online (Sandbox Code Playgroud)
当然,如果你只是想在逻辑上分割的SQL语句的线条像你和实际上并不需要一个新行,你永远可以替代Environment.NewLine的" ".
Hel*_*iac 91
作为附注,使用C#6.0,您现在可以将插值字符串与逐字字符串文字组合:
string camlCondition = $@"
<Where>
<Contains>
<FieldRef Name='Resource'/>
<Value Type='Text'>{(string)parameter}</Value>
</Contains>
</Where>";
Run Code Online (Sandbox Code Playgroud)
Car*_*oco 46
为什么人们会将字符串与字符串文字混淆?接受的答案是对不同问题的一个很好的答案; 不是这个.
我知道这是一个古老的话题,但我来到这里可能和OP一样,并且看到人们如何误读它是令人沮丧的.或许我误解了它,我不知道.
粗略地说,字符串是计算机存储器的一个区域,在执行程序期间,它包含可以映射到文本字符的字节序列.另一方面,字符串文字是一段尚未编译的源代码,它表示稍后在执行出现的程序期间初始化字符串的值.
在C#中,声明......
string query = "SELECT foo, bar"
+ " FROM table"
+ " WHERE id = 42";
Run Code Online (Sandbox Code Playgroud)
...... 不会产生三线串而是一根线; 三个字符串的串联(每个字符串从不同的字面值初始化),其中没有一个字符串包含换行符.
OP似乎要问的是 - 至少我会问这些话 - 不是如何在编译的字符串中引入模仿源代码中找到的换行符,而是如何分解清晰度很长,源代码中的单行文本,不会在编译的字符串中引入中断.并且不需要延长执行时间,花费加入来自源代码的多个子串.就像javascript或C++中多行字符串文字中的尾部反斜杠一样.
建议使用逐字字符串,请不要介意的StringBuilderS,String.Join用绳子逆转并没有什么,让我觉得人不是真正理解这个问题s甚至嵌套函数.或许我不明白.
据我所知,C#没有(至少在我使用的旧石器时代版本中,从前十年开始)有一个功能可以干净地生成多行字符串文字,可以在编译期间解决而不是执行.
也许当前版本支持它,但我想我会分享我在字符串和字符串文字之间感知的差异.
Tod*_*odd 38
在 C# 11 [2022] 中,您将能够使用原始字符串文字。\n使用原始字符串文字可以更轻松地使用 " 字符,而无需编写转义序列。
\nOP的解决方案:
\nstring query1 = """\n SELECT foo, bar\n FROM table\n WHERE id = 42\n """;\n\nstring query2 = """\n SELECT foo, bar\n FROM table\n WHERE id = 42\n and name = \'zoo\'\n and type = \'oversized "jumbo" grand\'\n """;\nRun Code Online (Sandbox Code Playgroud)\n有关原始字符串文字的更多详细信息
\n有关完整详细信息,请参阅原始字符串文字GitHub 问题;和博客文章 C# 11 预览更新 \xe2\x80\x93 原始字符串文字、UTF-8 等!
\nIsa*_*ala 23
添加多行:使用@
string query = @"SELECT foo, bar
FROM table
WHERE id = 42";
Run Code Online (Sandbox Code Playgroud)
将字符串值添加到中间:使用 $
string text ="beer";
string query = $"SELECT foo {text} bar ";
Run Code Online (Sandbox Code Playgroud)
多行字符串在中间添加值:使用 $@
string text ="Customer";
string query = $@"SELECT foo, bar
FROM {text}Table
WHERE id = 42";
Run Code Online (Sandbox Code Playgroud)
小智 10
我没有看到这个,所以我会在这里发布它(如果你有兴趣传递一个字符串,你也可以这样做.)这个想法是你可以在多行上打破字符串并添加你自己的内容(也在多条线上)以任何你想要的方式.这里"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
)";
}
Run Code Online (Sandbox Code Playgroud)
是的,您可以将一个字符串拆分为多行,而无需在实际字符串中引入换行符,但这并不漂亮:
string s = $@"This string{
string.Empty} contains no newlines{
string.Empty} even though it is spread onto{
string.Empty} multiple lines.";
Run Code Online (Sandbox Code Playgroud)
诀窍是引入计算结果为空的代码,并且该代码可以包含换行符而不影响输出。我将这种方法从这个答案改编为类似的问题。
对于问题是什么显然存在一些困惑,但是有两个提示表明我们在这里想要的是一个不包含任何换行符的字符串文字,其定义跨越多行。(在评论中他是这么说的,“这就是我所拥有的”显示的代码不会创建带有换行符的字符串)
此单元测试显示了意图:
[TestMethod]
public void StringLiteralDoesNotContainSpaces()
{
string query = "hi"
+ "there";
Assert.AreEqual("hithere", query);
}
Run Code Online (Sandbox Code Playgroud)
更改上面的查询定义,使其成为一个字符串文字,而不是两个字符串文字的串联,这两个字符串文字可能会或可能不会被编译器优化为一个。
C++ 方法是以反斜杠结束每一行,从而导致换行符被转义并且不会出现在输出中。不幸的是,仍然存在这样的问题:第一行之后的每一行必须左对齐,以免在结果中添加额外的空格。
只有一种不依赖于可能不会发生的编译器优化的选项,即将您的定义放在一行上。如果你想依赖编译器优化,你已经拥有的 + 就很棒;您不必左对齐字符串,也不会在结果中得到换行符,并且这只是一项操作,没有函数调用,可以期待优化。
您可以使用@和“”。
string sourse = @"{
""items"":[
{
""itemId"":0,
""name"":""item0""
},
{
""itemId"":1,
""name"":""item1""
}
]
}";
Run Code Online (Sandbox Code Playgroud)
除了Kind Contributor 关于原始字符串文字的回答之外
您现在还可以将其与字符串插值结合起来!
请参阅原始字符串文字
var someValue = 23.45f;
var json = $$"""
{
"summary": "text",
"value" : {{someValue}},
};
""";
Console.WriteLine(json);
Run Code Online (Sandbox Code Playgroud)
将导致
{
"summary": "text",
"value" : 23.45,
};
Run Code Online (Sandbox Code Playgroud)
(小提琴)