$"{a}{b}"
的方式.PS:仅仅是为了探索这2个特性的用法, 编码规范和实用性不在考虑范围内
{}
中表示该参数的值.定义一个F方法并通过字符串内插传入需要拼接的参数, 如F($"{a}{b}{c}")
[InterpolatedStringHandler] public ref struct MyInterpolatedStringHandler { DefaultInterpolatedStringHandler _default; bool firstAppend = false; public MyInterpolatedStringHandler(int literalLength, int formattedCount) { _default = new DefaultInterpolatedStringHandler(literalLength + (formattedCount * 16), formattedCount); // 在DefaultInterpolatedStringHandler 内部初始化char buffer 大小用的计算方法是: literalLength + formattedCount*11 // 所以我们假定我们的单个参数表达式的长度是13, 然后在加固定的3个字符" , :" 一共16个字符. 所以有了(formattedCount * 16) // 当然, 我们可以在这里吧要写入的对象传入进来(利用InterpolatedStringHandlerArgument特性), 比如说官方例子里面的Logger对象. // 参考 https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/tutorials/interpolated-string-handler#add-more-capabilities-to-the-handler } public void AppendLiteral(string s) { _default.AppendLiteral(s); // AppendLiteral处理内插字符串中的字面量, 意思就是 `$"aa:{a}"` 中的 `aa:`是字面量 } public void AppendFormatted<T>(T t, [CallerArgumentExpression("t")] string? tName = null) { // 按照我们想要的格式拼接字符串. if (!append) _default.AppendLiteral(", "); firstAppend = true; _default.AppendLiteral(tName); _default.AppendLiteral(":"); _default.AppendFormatted(t); } public string ToStringAndClear() { var s = _default.ToStringAndClear(); this = default; return s; } }
void F(MyInterpolatedStringHandler s)=> Console.WriteLine(s.ToStringAndClear());
int a=0; int b=1; string c=2; F($"{a}{b}{c}") //output "a:0, b:1, c:2"
public void Main() { int a=0; int b=1; string c=2; MyInterpolatedStringHandler result = new MyInterpolatedStringHandler(0, 3); result.AppendFormatted(a, "a"); result.AppendFormatted(b, "b"); result.AppendFormatted(c, "c"); F(result); }