C#中的多行string
有没有一种简单的方法来在C#中创build多行string文字?
这是我现在拥有的:
string query = "SELECT foo, bar" + " FROM table" + " WHERE id = 42";
我知道PHP有
<<<BLOCK BLOCK;
C#有类似的东西吗?
您可以在string
前使用@
符号来形成逐string字面值 :
string query = @"SELECT foo, bar FROM table WHERE id = 42";
当你使用这个方法时,你也不必转义特殊字符 ,除了双引号,如Jon Skeet的答案所示。
它在C#中被称为逐字串string ,它只是将@放在文字之前的问题。 这不仅允许多行,但它也closures逃脱。 比如你可以这样做:
string query = @"SELECT foo, bar FROM table WHERE name = 'a\b'";
唯一的转义是如果你想要一个双引号,你必须添加一个额外的双引号符号:
string quote = @"Jon said, ""This will work,"" - and it did!";
另一个需要注意的是在string.Format中使用string文字。 在这种情况下,您需要转义大括号/括号“{”和“}”。
// 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)
我发现使用string的问题是,它可以使你的代码看起来有点“ 怪异 ”,因为为了不在string本身中获得空格,它必须完全左alignment:
var someString = @"The quick brown fox...";
呸。
所以我喜欢使用的解决scheme,它保持与您的代码其余部分很好地alignment的解决scheme是:
var someString = String.Join( Environment.NewLine, "The", "quick", "brown", "fox...");
当然,如果你只是想像你一样在逻辑上分割SQL语句的行,并且实际上不需要换行,那么你总是可以用Environment.NewLine
replace" "
。
作为一个附带说明,使用C#6.0,现在可以将插入string与逐字string文字结合起来:
string camlCondition = $@" <Where> <Contains> <FieldRef Name='Resource'/> <Value Type='Text'>{(string)parameter}</Value> </Contains> </Where>";
为什么人们用string文字保持混淆string? 被接受的答案是对另外一个问题的一个很好的回答。 不是这个。
我知道这是一个古老的话题,但是我来到这里的时候可能和OP一样的问题,看到人们如何误读它,这是令人沮丧的。 或者,也许我在误读它,我不知道。
粗略地说,string是计算机内存的一个区域,在程序执行过程中,它包含一系列可以映射到文本字符的字节。 另一方面,string文字是一段尚未编译的源代码,代表在稍后出现的程序执行期间用于初始化string的值。
在C#中,声明…
string query = "SELECT foo, bar" + " FROM table" + " WHERE id = 42";
…… 不会产生三行string,而是一行一行; 三个string的连接(每个string都从不同的字面值初始化),其中没有一个包含新的修饰符。
OP似乎在问什么 – 至less我会用这些单词来问 – 不是如何在编译后的string中引入模仿在源代码中find的换行符,而是如何为了清晰起见而打破长期,源代码中的单行文本不会在编译的string中引入中断。 在不需要延长执行时间的情况下,花费在join来自源代码的多个子string上。 像JavaScript或C ++中的多行string文字中的反斜线一样。
build议使用逐字string, String.Join
使用StringBuilder
s, String.Join
s甚至嵌套函数与string反转,什么不是,使我认为人们并不真正理解这个问题。 或者,也许我不明白。
据我所知,C#没有(至less在旧版本中,我仍然使用的是旧版本)有一个function,可以清理地生成多行string文字 ,这些文字可以在编译而不是执行过程中解决。
也许目前的版本支持它,但我想我会分享我认为的string和string文字之间的差异。
我没有看到这个,所以我会在这里发表(如果你有兴趣传递一个string,你也可以这样做)。这个想法是,你可以把string分成多行并添加自己的内容(也是在多行)以任何你想要的方式。 这里“tableName”可以传入string。
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的添加似乎是可行的:
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.
如果你喜欢,你可以在这里运行。
你可以使用这两种方法:
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()中,你需要定义你想要使用的string和行的长度,这很简单。 谢谢 。