有没有一种简单的方法在C#中创建多行字符串字面量?
这是我现在拥有的代码:
string query = "SELECT foo, bar"
+ " FROM table"
+ " WHERE id = 42";
我知道PHP有
<<<BLOCK
BLOCK;
C#有类似的东西吗?
您可以在字符串前面使用@
符号形成一个verbatim string literal:
string query = @"SELECT foo, bar
FROM table
WHERE id = 42";
当您使用此方法时,您也不需要转义特殊字符,除了Jon Skeet的答案中显示的双引号。
@"my string".Replace(Environment.NewLine, "")
- John Rasch@
和新的 C# 运算符 $
结合使用? - Afshar Mohebi在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>";
$@"{{example literal text { fooString }. }}"
。这可能会让一些人感到困惑,因为 Angular、React 和 Vue.js 使用相反的约定。 - Patrick Szalapski{date.ToString("yyyy-mm-dd")}
,你可能需要考虑@dav_i的答案,因为这种插值方式更加简洁,而且不必去处理双引号。 - AndrewGentry我发现使用字符串字面值的问题在于,它可能会使你的代码看起来有点“奇怪”,因为为了避免字符串本身中出现空格,它必须完全左对齐:
var someString = @"The
quick
brown
fox...";
噫。
因此,我喜欢使用的解决方案是将其与您的其余代码保持良好对齐:
var someString = String.Join(
Environment.NewLine,
"The",
"quick",
"brown",
"fox...");
当然,如果您只想在SQL语句中逻辑地拆分行,而实际上并不需要换行符,您可以始终将Environment.NewLine
替换为" "
。"The", "Quick", $"{fox.color}", "Fox"
的事情。 - AndrewGentry还有一个需要注意的问题是在使用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)
$@
将 {
解释为“插值字符串”。这意味着 @
不再具有这样的功能。因此,括号不再需要转义。【我没有进行过测试。】 - undefined为什么人们经常混淆字符串和字符串字面值?被采纳的答案是回答了不同的问题,而不是这个问题。
我知道这是一个老话题,但我可能和楼主有同样的疑问,看到人们一直误解它真的很让人沮丧。或者也许我自己理解错了,我不知道。
粗略地说,字符串是计算机内存中的一个区域,在程序执行期间包含一个可以映射到文本字符的字节序列。另一方面,字符串字面值是源代码的一部分,尚未编译,表示在程序执行期间用于初始化字符串的值。
在C#中,语句...
string query = "SELECT foo, bar"
+ " FROM table"
+ " WHERE id = 42";
...不会生成三行字符串,而是一个单行字符串;由三个字符串连接而成(每个字符串都从不同的文字初始化),没有任何一个包含换行符修饰符。
在我的理解中,OP似乎询问的不是如何在编译后的字符串中引入类似源代码中的换行符,而是如何在源代码中清晰地分隔一个长的单行文本,而无需在编译后的字符串中引入断点。而且也不需要花费更长的执行时间来连接来自源代码的多个子字符串。就像JavaScript或C++中的多行字符串字面量内部的尾随反斜杠一样。
建议使用原始字符串,不要管 StringBuilder
、String.Join
甚至是嵌套函数与字符串反转等等,让我觉得人们并没有真正理解这个问题。或者可能是我没有理解它。
据我所知,C#(至少在上个十年我还在使用的古老版本中)没有一个功能可以干净地生成可在编译期间解析而不是执行期间解析的多行字符串字面量。
也许当前版本支持它,但我想分享一下我认为字符串和字符串字面量之间的差异。
更新:
(来自 MeowCat2012 的评论) 您可以。OP的“+”方法是最好的方法。根据规范,优化是有保证的:https://dev59.com/2nVC5IYBdhLWcg3wcwwm#288802
添加多行:使用 @ 符号
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";
{expression}
被称为插值表达式。以 $
开头的整个字符串被称为插值字符串。 - undefinedstring 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'
""";
有关原始字符串字面量的更多细节
有关完整详细信息,请参阅Raw String Literals GitHub问题; 以及博客文章C# 11预览更新 - 原始字符串文字,UTF-8等!
@
,换行符被包含在文本中。(这个回答和@
之间的区别在于,"
不需要转义。) - undefined您可以使用@符号和""引号。
string sourse = @"{
""items"":[
{
""itemId"":0,
""name"":""item0""
},
{
""itemId"":1,
""name"":""item1""
}
]
}";
我没看过这个,所以我会在这里贴出来(如果你想传递一个字符串,也可以这样做。)这个想法是你可以将字符串分成多行,并以任何你希望的方式添加自己的内容(同样也可以跨越多行)。在这里,“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的问题是关于如何直接在代码中输入多行字符串文字,而不是关于如何构造数据库查询语句本身的。 :) - dbeachy1
42
是来自用户输入的,为避免 SQL 注入攻击,建议将其绑定为参数。 - Jens Mühlenhoff