有没有一种简单的方法在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#有类似的东西吗?
我们有一个包含很长字符串的变量的单元测试.
问题是如何在代码中编写它,没有换行问题或代码难以阅读.
在VB中有一个行继续字符,在C#中是否存在等价物?
C#6为内插字符串文字带来了编译器支持,语法如下:
var person = new { Name = "Bob" };
string s = $"Hello, {person.Name}.";
Run Code Online (Sandbox Code Playgroud)
这对于短字符串很有用,但是如果要生成更长的字符串,必须在一行中指定它吗?
使用其他类型的字符串,您可以:
var multi1 = string.Format(@"Height: {0}
Width: {1}
Background: {2}",
height,
width,
background);
Run Code Online (Sandbox Code Playgroud)
要么:
var multi2 = string.Format(
"Height: {1}{0}" +
"Width: {2}{0}" +
"Background: {3}",
Environment.NewLine,
height,
width,
background);
Run Code Online (Sandbox Code Playgroud)
我无法找到一种方法来实现这一点,使用字符串插值,而不是只有一行:
var multi3 = $"Height: {height}{Environment.NewLine}Width: {width}{Environment.NewLine}Background: {background}";
Run Code Online (Sandbox Code Playgroud)
我意识到在这种情况下你可以用来\r\n代替Environment.NewLine(不太便携),或者把它拉到本地,但是有些情况下你不能将它减少到一行以下而不会失去语义强度.
是不是字符串插值不应该用于长字符串?
我们应该使用StringBuilder更长的字符串吗?
var multi4 = new StringBuilder()
.AppendFormat("Width: {0}", width).AppendLine()
.AppendFormat("Height: {0}", height).AppendLine()
.AppendFormat("Background: {0}", background).AppendLine()
.ToString();
Run Code Online (Sandbox Code Playgroud)
还是有更优雅的东西?
在 C#7 中,我尝试使用多行内插字符串与FormttableString.Invariant一起使用,但字符串连接似乎对 FormttableString 无效。
根据文档: FormattableString 实例可能由 C# 或 Visual Basic 中的内插字符串产生。
以下 FormttableString 多行连接无法编译:
using static System.FormattableString;
string build = Invariant($"{this.x}"
+ $"{this.y}"
+ $"$this.z}");
Run Code Online (Sandbox Code Playgroud)
错误 CS1503 - 参数 1:无法从“字符串”转换为“System.FormattableString”
使用没有连接的内插字符串确实可以编译:
using static System.FormattableString;
string build = Invariant($"{this.x}");
Run Code Online (Sandbox Code Playgroud)
你如何用类型实现多行字符串连接FormattableString?
(请注意 FormattableString 是在 .Net Framework 4.6 中添加的。)
有没有办法使用C#6的字符串插值多行字符串?
就像是
string a = "1111";
string s = @$"
{a}
";
Run Code Online (Sandbox Code Playgroud)
以上不起作用.
一个例子:
var a = $"Some value 1: {b1:0.00}\nSome value 2: {b2}\nSome value 3: {b3:0.00000}\nSome value 4: {b4:0.00}\nSome value 5: {b6:0.0}\nSome value 7: {b7:0.000000000}";
Run Code Online (Sandbox Code Playgroud)
这有点难以阅读.
我能做到
var a = $"Some value 1: {b1:0.00}\n" +
$"Some value 2: {b2}\n" +
$"Some value 3: {b3:0.00000}\n" +
$"Some value 4: {b4:0.00}\n" +
$"Some value 5: {b6:0.0}\n" +
$"Some value 7: {b7:0.000000000}";
Run Code Online (Sandbox Code Playgroud)
但是这里有一条评论说什么这将是多次调用string.Format,我认为它会(不知道如何检查它,IL对我来说是一个黑盒子).
问题:可以吗?拆分长插值字符串有哪些其他选项?