首页 文章

C#中的多行字符串文字

提问于
浏览
784

有没有一种简单的方法在C#中创建多行字符串文字?

这就是我现在拥有的:

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

我知道PHP有

<<<BLOCK

BLOCK;

C#有类似的东西吗?

10 回答

  • 1

    它在C#中被称为verbatim string literal,它只是将@放在文字之前 . 这不仅允许多行,而且还会关闭转义 . 例如,您可以这样做:

    string query = @"SELECT foo, bar
    FROM table
    WHERE name = 'a\b'";
    

    逃脱的唯一一点是,如果你想要一个双引号,你必须添加一个额外的双引号符号:

    string quote = @"Jon said, ""This will work,"" - and it did!";
    
  • 2

    另一个需要注意的是在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)
    
  • 80

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

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

    呸 .

    因此,我喜欢使用的解决方案是:它使所有代码与代码的其余部分保持良好对齐:

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

    当然,如果您只想逻辑地拆分SQL语句的行并且实际上不需要换行,那么您总是可以将 Environment.NewLine 替换为 " " .

  • 74

    您可以使用以下两种方法:

    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()中,您需要定义要使用的字符串和行长度,这非常简单 . 谢谢 .

  • 453

    您可以使用 string 前面的 @ 符号来形成verbatim string literal

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

    当你使用这个方法时,你也是do not have to escape special characters,除了Jon Skeet的回答中所示的双引号 .

  • 92

    作为附注,使用C#6.0,您现在可以将插值字符串与逐字字符串文字组合:

    string camlCondition = $@"
    <Where>
        <Contains>
            <FieldRef Name='Resource'/>
            <Value Type='Text'>{(string)parameter}</Value>
        </Contains>
    </Where>";
    
  • -7

    我没有看到这个,所以我会在这里发布它(如果你有兴趣传递一个字符串,你也可以这样做 . )这个想法是你可以在多行上打破字符串并添加你自己的内容(也在多条线上)以任何你想要的方式 . 这里“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
                                    )";
        }
    
  • 11

    为什么人们会将字符串与字符串文字混淆?接受的答案是对不同问题的一个很好的答案;不是这个 .

    我知道这是一个古老的话题,但我来到这里可能和OP一样,并且看到人们如何继续误读它是令人沮丧的 . 或许我误解了它,我不知道 .

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

    在C#中,声明......

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

    ...不会产生三线串而是一根线;三个字符串的串联(每个字符串从不同的字面值初始化),其中没有一个字符串包含换行符 .

    OP似乎要问的是 - 至少我会问这些话 - 不是如何在编译的字符串中引入模仿源代码中找到的换行符,而是如何为了清晰度而分解,源代码中的单行文本,不会在编译的字符串中引入中断 . 并且不需要延长执行时间,花费了来自源代码的多个子串 . 就像javascript或C中多行字符串文字中的尾部反斜杠一样 .

    建议使用逐字字符串,永远不要使用字符串反转而不使用字符串反转的嵌套函数,这会让我觉得人们并没有真正理解这个问题 . 或许我不明白 .

    据我所知,C#没有(至少在我使用的旧石器时代版本中,从前十年开始)有一个功能可以干净地生成多行字符串 literals ,可以在编译期间解决而不是执行 .

    也许当前版本支持它,但我想我会分享我在字符串和字符串文字之间感知的差异 .

  • 1239

    您可以使用 @"" .

    string sourse = @"{
            ""items"":[
            {
                ""itemId"":0,
                ""name"":""item0""
            },
            {
                ""itemId"":1,
                ""name"":""item1""
            }
            ]
        }";
    
  • 30

    如果您不想要空格/换行符,则字符串添加似乎有效:

    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.
    

    如果您愿意,可以运行上面的here .

相关问题