如何在C# 11的三重引号字符串中保留内部缩进?
在C#中保留嵌套三重引号字符串的内部缩进方案
当你在C#中使用插值字符串嵌套三重引号(""")时,子字符串的缩进不会自动继承父字符串的缩进层级,导致输出的缩进效果不符合预期。要解决这个问题,不需要修改子字符串的内部内容,只需对嵌套的字符串进行统一的缩进处理即可,以下是几种可行方案:
方案1:使用.NET 6+内置的Indent方法
.NET 6及以上版本为string类型提供了Indent(int)扩展方法,可以给字符串的每一行添加指定数量的空格缩进。直接在插值时调用该方法,即可让子字符串的所有行继承父字符串的缩进:
public static string Text => $""" I have 4 spaces {Text2.Indent(4)} """; public static string Text2 => """ I have 8 spaces I should have 12, why not? """;
这样Text2的每一行都会额外增加4个空格,最终输出会和预期的层级缩进一致。
方案2:自定义缩进扩展方法(兼容.NET 5及以下)
如果你的项目基于.NET 5或更早版本,可以自己实现一个字符串扩展方法来处理缩进:
public static class StringExtensions { public static string Indent(this string input, int spaceCount) { if (string.IsNullOrWhiteSpace(input)) return input; var indent = new string(' ', spaceCount); return string.Join(Environment.NewLine, input.Split(new[] { Environment.NewLine }, StringSplitOptions.None) .Select(line => indent + line)); } }
使用方式和方案1完全一致:在插值时调用{Text2.Indent(4)}即可实现统一缩进。
原理说明
三重引号字符串会根据定义时的最小前导缩进自动去除多余的前导空格。比如Text2定义时,第一行的前导空格是8个,这是它的最小缩进,所以输出时会保留每行相对于这个最小缩进的空格数。通过Indent方法给整个Text2的每一行添加额外的缩进,就能让它的层级和父字符串的缩进对齐,不需要修改Text2内部的文本内容。
内容的提问来源于stack exchange,提问作者cflorenciav
相关产品推荐
相关产品推荐

