通过自定义字符串内插处理程序(InterpolatedStringHandler)和CallerArgumentExpression特性来实现一个好玩的场景
背景知识介绍
- 什么是自定义字符串内插处理程序?
- 简单来讲就是自定义一个高性能的字符串拼接程序 通过
$"{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);
// 在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;
}
}
实现F方法
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);
}
总结
- 这2个特性的更多介绍可以参考上面背景知识中给出的连接. 官方介绍很详细
- 什么场景下适合自定义一个字符串内插程序(string interpolation handler) 可以阅读 新大纲
通过自定义字符串内插处理程序(InterpolatedStringHandler)和CallerArgumentExpression特性来实现一个好玩的场景的更多相关文章
- C++自定义字符串类
//header.h #ifndef _HEADER_H #define _HEADER_H #define defaultSize 128 #include<iostream> #inc ...
- C# 中的字符串内插
$ 特殊字符将字符串文本标识为内插字符串. 内插字符串是可能包含内插表达式的字符串文本. 将内插字符串解析为结果字符串时,带有内插表达式的项会替换为表达式结果的字符串表示形式. 此功能在 C# 6 及 ...
- struts2:遍历自定义字符串数组,遍历Action实例所引用对象中的数组
在struts2:OGNL表达式,遍历List.Map集合:投影的使用一文中已经讲述了OGNL遍历List.Map集合等功能. 本文简单写一个遍历数组的示范程序. 1. 遍历自定义字符串数组 < ...
- ASP.NET之自定义异步HTTP处理程序(图文教程)
前面我们学习了关于关于自定义同步HTTP处理程序,相信大家可能感觉有所成就,但是这种同步的机制只能对付客户访问较少的情况或者数据处理量不大的情况,而今天这篇文章就是解决同步HTTP处理程序的这个致命缺 ...
- java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串
java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串 package com.zdz.test; im ...
- 使用js在HTML中自定义字符串格式化方法
Python中支持字符串格式化,其基本形式如下: str = "I'm {name},{age} years old" print(str.format(name="te ...
- PHP 自定义字符串中的变量名解析
PHP 自定义字符串中的变量名解析 这样一个需求:页面的 title 可以在后台自定义,自定义内容中可能包含变量,变量用 {$var} 表示, 其中 $var 为变量名 将 title 字段存入数 ...
- C#字符串内插-$
1.字符串内插 $特殊字符将字符串文本标识未内插字符串,可能包含内插表达式的字符串文本. 将内插字符串解析为结果字符串,带有内插表达式的项会替换为表达式结果的字符串表示形式. 在C#6级更高版本语言中 ...
- Java实现 LeetCode 791 自定义字符串排序(桶排序)
791. 自定义字符串排序 字符串S和 T 只包含小写字符.在S中,所有字符只会出现一次. S 已经根据某种规则进行了排序.我们要根据S中的字符顺序对T进行排序.更具体地说,如果S中x在y之前出现,那 ...
- HTTP 错误 500.21 - Internal Server Error 处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
HTTP 错误 500.21 - Internal Server Error 处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipe ...
随机推荐
- 使用AI技术(单张图片或文字)生产3D模型 —— Ai生成3D模型的时代来了
地址: https://www.bilibili.com/video/BV1A2421P7pH/ 视频用到的工具voxcraft体验地址:https://voxcraft.ai/
- 如何访问SCI-Hub上的资源?
答案: 使用tor访问.onion网络资源. tor 下载地址: https://www.torproject.org/ 如果不使用tor方式访问可能会无法访问,被提示:
- vue开发者工具dev-tool的安装
1.下载网址:https://github.com/Redxym/dev-tools 2.谷歌浏览器->扩展程序,拖动刚刚下载好的压缩包,将chrome文件夹添加至'加载已解压的扩展程序' // ...
- Spring 相关知识
https://www.bilibili.com/video/BV1gW411W7wy?spm_id_from=333.788.b_636f6d6d656e74.173 老雷的Spring注解驱动 源 ...
- spring声明事务失效问题
问题: 在项目开发中遇到了一个spring事务失效的问题,检查配置文档,都没有问题,其他的类中的方法都能进行事务管理,而这个类中的方法却不行. 分析 查看代码发现三个问题: 原因1 ...
- ubuntu16.04/CentOS 7自动以root身份登录桌面
ubuntu16.04 1.首先设置root用户密码: # sudo passwd root 输入普通用户密码,再输入root用户密码: 2.启用登录时的root选项: # 编辑50-ubuntu.c ...
- lamada 表达式
语法篇 -- \(lamada\) 表达式 函数内定义的函数,看起来能使代码更加美观. 具体定义方法: 前面挂个 auto ,不管他返不返回值 后面是函数名(表达式名) 例: Cekas 先是中括号表 ...
- springCloud allibaba 微服务引言
微服务篇: springcloud 常见组件有哪些 nacos 的服务注册表结构是怎样的 nacos 如何支撑阿里内部数十万服务注册压力 nacos 如何避免并发读写冲突问题 nacos 和eurek ...
- P9032 [COCI2022-2023#1] Neboderi
题意 给长度为 \(n\) 的数组 \(a\),求长度不小于 \(k\) 的区间 \([l,r]\) 使得 \(\gcd_{i = l}^r a_i \times \sum_{i = l}^r a_i ...
- 知识点考古:php5的面向对象学习笔记
闲来无事翻看以前收藏的资料,考古到保存的这篇文章对php的OOP的整理还很系统.原链接已经打不开(http://www.cublog.cn/u/17686/showart.php?id=146562) ...