C#6提供了对内插字符串文字的编译器支持,语法如下:

var person = new { Name = "Bob" };

string s = $"Hello, {person.Name}.";

这对于短字符串很好,但是如果你想产生一个更长的字符串,必须在一行中指定吗?

使用其他类型的字符串,您可以:

    var multi1 = string.Format(@"Height: {0}
Width: {1}
Background: {2}",
        height,
        width,
        background);

或者:

var multi2 = string.Format(
    "Height: {1}{0}" +
    "Width: {2}{0}" +
    "Background: {3}",
    Environment.NewLine,
    height,
    width,
    background);

我找不到一种方法来实现这一点,如果没有一行字符串插值:

var multi3 = $"Height: {height}{Environment.NewLine}Width: {width}{Environment.NewLine}Background: {background}";

我意识到,在这种情况下,你可以用\r\n代替Environment.NewLine(便携性较差),或者把它拉到本地,但在某些情况下,你无法在不失go 语义强度的情况下将其减少到一行以下.

是不是很简单,字符串插值不应该用于长字符串?

我们应该用StringBuilder来表示更长的字符串吗?

var multi4 = new StringBuilder()
    .AppendFormat("Width: {0}", width).AppendLine()
    .AppendFormat("Height: {0}", height).AppendLine()
    .AppendFormat("Background: {0}", background).AppendLine()
    .ToString();

还是有更优雅的?

推荐答案

您可以将$@组合在一起,以获得多行插值字符串文字:

string s =
$@"Height: {height}
Width: {width}
Background: {background}";

来源:Long string interpolation lines in C#6(感谢@Ric找到线索!)

.net相关问答推荐

删除数据库项目中的表

如何在dotnet中使用OpenTelemetry Prometheus导出器导出多个版本的度量?

Npgsql Minimum Pool Size 似乎没有被考虑在内

如何判断属性设置器是否公开

编译时禁用 Dll 文化文件夹

如何将浮点数向上舍入到 C# 中最近的 int?

是什么让 Enum.HasFlag 这么慢?

如何根据新的安全策略在 .Net 中发送邮箱?

图像与位图类

将跟踪输出重定向到控制台

修剪数组中的所有字符串

Double.TryParse 或 Convert.ToDouble - 哪个更快更安全?

使用 XmlSerializer 将空 xml 属性值反序列化为可为空的 int 属性

如何使用 c# 仅获取目录中的文件名?

资源(.resx)文件有什么好处?

微软内部 PriorityQueue 中的错误?

并发字典正确用法

判断任意字符串是否为有效文件名的最简单方法

如何为我的 C# 应用程序创建产品密钥?

如何为 Dapper 查询动态创建参数