有一个简单的方法来创建一个多行字符串文字在c# ?

这是我现在拥有的:

string query = "SELECT foo, bar"
+ " FROM table"
+ " WHERE id = 42";

我知道PHP

<<<BLOCK

BLOCK;

c#有类似的东西吗?


当前回答

我还没有见过这个,所以我会张贴在这里(如果你有兴趣传递一个字符串,你也可以这样做)。其思想是,您可以将字符串分成多行,并以您希望的任何方式添加自己的内容(也在多行上)。这里“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 sourse = @"{
        ""items"":[
        {
            ""itemId"":0,
            ""name"":""item0""
        },
        {
            ""itemId"":1,
            ""name"":""item1""
        }
        ]
    }";

我发现使用字符串文字的问题是,它会让你的代码看起来有点“奇怪”,因为为了在字符串本身中不获得空格,它必须完全左对齐:

    var someString = @"The
quick
brown
fox...";

讨厌的东西。

因此,我喜欢使用的解决方案是:

var someString = String.Join(
    Environment.NewLine,
    "The",
    "quick",
    "brown",
    "fox...");

当然,如果您只是想在逻辑上拆分SQL语句的行,而实际上并不需要新的行,那么您总是可以替换Environment。换行" "。

为什么人们总是混淆字符串和字符串字面量?公认的答案是另一个问题的绝佳答案;但这次不是。

我知道这是一个老话题,但我来这里可能是带着和OP一样的问题,看到人们一直误解它是令人沮丧的。也许是我看错了,我不知道。

粗略地说,字符串是计算机内存中的一个区域,在程序执行期间,它包含可以映射到文本字符的字节序列。另一方面,字符串字面值是一段尚未编译的源代码,它表示稍后在程序执行期间用于初始化字符串的值。

在c#中,语句…

 string query = "SELECT foo, bar"
 + " FROM table"
 + " WHERE id = 42";

... 不生成三行字符串,而是生成一行字符串;三个字符串的连接(每个字符串从不同的文字初始化),其中没有一个包含换行修饰符。

OP似乎要问的问题——至少我用这些词要问的问题——不是如何在编译后的字符串中引入模仿源代码中的换行符,而是如何在不引入已编译字符串中的换行符的情况下,在源代码中拆分长而单行的文本以使其清晰。并且不需要延长执行时间,只需将来自源代码的多个子字符串连接起来即可。就像javascript或c++中多行字符串文字中的尾随反斜杠。

建议使用逐字字符串,别管StringBuilders, String。连接,甚至嵌套函数与字符串反转等等,让我认为人们没有真正理解这个问题。也许我不明白。

据我所知,c#没有(至少在我仍在使用的旧石器时代版本中,从上个十年开始)有一个功能,可以在编译而不是执行期间清晰地生成多行字符串字面量。

也许当前的版本确实支持它,但我想分享一下我在字符串和字符串字面量之间的区别。

更新:

(来自MeowCat2012的评论)你可以。OP的“+”方法是最好的。根据规范,优化是有保证的:http://stackoverflow.com/a/288802/9399618

你可以在字符串前面使用@符号来形成一个逐字逐句的字符串字面量:

string query = @"SELECT foo, bar
FROM table
WHERE id = 42";

使用此方法时,您也不必转义特殊字符,除了Jon Skeet的回答中所示的双引号。

如果你不想要空格/换行,字符串加法似乎可以工作:

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.

如果你愿意,你可以在这里运行上面的程序。