背景知识介绍
- 什么是自定义字符串内插处理程序?
- 简单来讲就是自定义一个高性能的字符串拼接程序 通过
$"{a}{b}"
的方式.
- 什么是CallerArgumentExpression?
- 获得传进来的参数表达式的文本形式. F(string s, [CallerArgumentExpression("s")] sExpression); F(Datetime.Now.ToString()); //sExpression is "Datetime.Now.ToString()"
臆想的一个场景: 拼接字符串, 要求自动包含字符串变量的名字和值, 并用":,"分割.
PS:仅仅是为了探索这2个特性的用法, 编码规范和实用性不在考虑范围内
- input: 有参数 [a,b,c]
- output "a:{a}, b:{b}, c:{c}";
{}
中表示该参数的值.
利用字符串内插的方式实现这个场景
定义一个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); |
| |
| |
| |
| |
| } |
| public void AppendLiteral(string s) |
| { |
| _default.AppendLiteral(s); |
| } |
| 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; |
| } |
| } |
实现F方法
| void F(MyInterpolatedStringHandler s)=> Console.WriteLine(s.ToStringAndClear()); |
调用例子
| int a=0; |
| int b=1; |
| string c=2; |
| F($"{a}{b}{c}") |
如果我们反编译这些代码,会看到和下面代码差不多:
| 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); |
| } |
总结
- 这2个特性的更多介绍可以参考上面背景知识中给出的连接. 官方介绍很详细
- 什么场景下适合自定义一个字符串内插程序(string interpolation handler) 可以阅读 新大纲
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?