dotnet 6 InterpolatedStringHandler 构造函数的 out 参数有什么意义

news/2025/1/21 7:11:02/文章来源:https://www.cnblogs.com/lindexi/p/18682800

根据 探索 C# 字符串内插处理程序 - C# - Microsoft Learn 文档可以知道,在文档的最后一步介绍了在构造方法里面带上一个 out bool isEnable 参数。但是文档没有说明带上这个参数会给应用程序带来什么优化

本文就来接着官方文档继续探索一下

如以下代码示例,编写一个 InterpolatedStringHandler 类型,且将其作为另一个类的内部结构体

class Fx
{public void Foo([InterpolatedStringHandlerArgument("")] ref FooInterpolatedStringHandler fooInterpolatedStringHandler){}public bool Enable { set; get; }[InterpolatedStringHandler]public ref struct FooInterpolatedStringHandler{public FooInterpolatedStringHandler(int literalLength, int formattedCount, Fx fx, out bool isEnable){isEnable = fx.Enable;}public void AppendLiteral(string s){}public void AppendFormatted<T>(T value){}}
}

期望的就是在 Fx 的 Enable 为 true 时才干活,这是通常一些运行时的调试代码减少资源损耗的方法

如以上代码可以看到,在调用 Foo 方法的时候,将会替换内插字符串为 FooInterpolatedStringHandler 的作用

如以上代码可以看到 FooInterpolatedStringHandler 的构造方法里面最后一个参数是一个 out bool isEnable 布尔参数

这里的语法是限定的,绑定 C# 10 或更高版本语义限定。要求 out bool isEnable 参数作为构造函数最后一个参数,且只能使用 bool 类型,禁止其他类型。使用其他类型将会在调用方报错提示找不到最合适的重载或未提供所需参数等错误。但对参数名没有限制,可以随意命名,如 out bool lindexiIsDoubi 也是合法的

那么这个 out 参数的作用是什么?咱编写一点测试代码来测试一下

var fx = new Fx();
fx.Foo($"asd{GetTestInfo()}");Console.WriteLine("Hello, World!");int GetTestInfo()
{Console.WriteLine($"GetTestInfo");return 2;
}

如果没有黑科技的话,预期就是 GetTestInfo 方法会被调用,且输出 GetTestInfo 内容到控制台。但如果大家尝试到本文末尾找到本文所有代码的下载方法,下载到本文的测试代码,将会发现 GetTestInfo 方法没有被调用,控制台也没有输出任何内容

这就意味着如果构造函数最后一个布尔参数返回 false 时,将不会对内插字符串的参数进行求值。这是一个非常好的优化

这就意味着可以放心在编写一些调试输出字符串,这些调试输出字符串也可以放心带上一些需要求值的参数值,这个过程是无伤的,不会有资源损耗

那么这个黑科技是如何玩出来的?以上的 fx.Foo($"asd{GetTestInfo()}"); 会实际被解析为以下等价 C# 代码

    Fx fx = new Fx();Fx.FooInterpolatedStringHandler fooInterpolatedStringHandler = new Fx.FooInterpolatedStringHandler(3, 1, fx, out bool isEnable);if (isEnable){fooInterpolatedStringHandler.AppendLiteral("asd");fooInterpolatedStringHandler.AppendFormatted<int>(GetTestInfo());}fx.Foo(ref fooInterpolatedStringHandler);

如以上等价代码可见,在构造函数返回的布尔参数,将会被用来作为判断逻辑。如以上代码所示,返回的 isEnable 会被作为判断条件,决定后续的参数是否传入

对于很多运行时调试逻辑来说,这个科技能有非常好的优化,可以极大减少调试逻辑的资源占用

即在运行时调试逻辑里面,如果判定当前是非调试模式,则可将 out bool 参数返回为 false 从而不再对后续参数进行求值和方法调用。再加上本身 InterpolatedStringHandler 可以如本文的 FooInterpolatedStringHandler 一样设计为 ref struct 结构体,在此调用过程中,完全没有堆对象分配,完全在栈上完,几乎没有成本开销。详细请看 Improved interpolated strings - C# feature specifications Microsoft Learn

本文代码放在 github 和 gitee 上,可以使用如下命令行拉取代码。我整个代码仓库比较庞大,使用以下命令行可以进行部分拉取,拉取速度比较快

先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin baa4bf01fabe21d92cbc0c1a5430e4fbfea90523

以上使用的是国内的 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码。如果依然拉取不到代码,可以发邮件向我要代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin baa4bf01fabe21d92cbc0c1a5430e4fbfea90523

获取代码之后,进入 Workbench/WhichekehealemkaWelcelahee 文件夹,即可获取到源代码

更多技术博客,请参阅 博客导航

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/872619.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读量子霸权10量子健康

量子计算机或颠覆医疗领域,加速新抗生素、疫苗研发,预警病毒,助力免疫系统研究,对抗癌症等难治之症。1. 量子健康 1.1. 在人类历史的大部分时间里,人类的平均预期寿命徘徊在20岁到30岁之间 1.2. 纵观人类历史,医生好像一直在扮演庸医和江湖骗子的角色,浮夸地提供所谓的“…

怎么让div中的图片和文字同时上下居中?

在前端开发中,有多种方法可以让一个 div 中的图片和文字同时上下居中。以下是一些常见的方法: 1. 使用 Flexbox Flexbox 是一个非常强大的布局模型,可以很容易地实现元素的居中。 <div class="container"><img src="image.jpg" alt="Imag…

3D NAND中基于图的近似最近邻搜索的Proxima近存储加速(下)

D.动态名单和提前终止 我们提出了一种动态列表和提前终止策略,以在图遍历过程中利用这些信息,如算法1所示。我们观察到,大多数查询在较小的T(候选列表大小)处收敛(找到它们的真实k-NN)。进一步增加T不会提高这些查询的召回率,只会增加计算成本。图6-(a)显示了DiskANN…

3D NAND中基于图的近似最近邻搜索的Proxima近存储加速(上)

3D NAND中基于图的近似最近邻搜索的Proxima近存储加速 摘要——近似最近邻搜索(ANNS)在各种应用中起着不可或缺的作用,包括推荐系统、信息检索和语义搜索。在尖端的ANNS算法中,基于图的方法在海量数据集上提供了卓越的准确性和可扩展性。然而,性能最好的基于图的ANN搜索解…

软件工程中的经验方法笔记

第一讲中上:收集数据(比如挖掘数据,etc)。 右中:分析数据:收集了数据自然要分析。定量:计算 定性:理解人们在说什么。 中下:解释数据:从数据科学的分析结果到软件工程方面的信息,我们需要知道某个特定的变量对整个软件工程的影响。 左中:干预、推荐:通过软件工程方…

推荐4书《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》,谢谢

4本书推荐《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》由清华大学出版社资深编辑赵佳霓老师策划编辑的新书《AI芯片开发核心技术详解》已经出版,京东、淘宝天猫、当当等网上,相应陆陆续续可以购买。该…

【CodeForces训练记录】Codeforces Round 999, Div. 1 + Div. 2

训练情况 赛后反思 幽默A题WA了两发,B题在努力回忆set里面怎么upper_bound,开完两道就在罚坐了 A题 简单的性质:偶数+偶数=偶数,奇数+奇数=偶数,奇数+偶数=奇数,每次除完保证是奇数,所以我们只需要把偶数扔到第一个,接下来全部是奇数,答案是奇数个数加一,如果没有奇数…

Hyper-V中如何调整Ubuntu22虚拟机的分辨率

转载:Hyper-V中如何调整Ubuntu22虚拟机的分辨率 - 知乎 使用win10中的hyper-v安装ubuntu22,发现分辨率过低并且在ubuntu内无法调整display settings。以下为此问题的解决方法: 步骤:修改ubuntu系统中的grub文件; 在win10中,设置Hyper-v修改ubuntu系统中的grub文件 在ubun…

【算法部署】工具下篇

一、算法部署简介算法部署任务是将已开发的算法模型应用到实际场景中去的过程。这个过程通常需要在计算机、服务器或其它硬件设备上面运行算法模型,并编写一些代码来调用模型。任何模型其实都会涉及到模型部署任务,其实你在调用现成的API接口做推理的过程也可以叫做模型部署。…

【算法部署】工具上篇

算法部署简介算法部署任务是将已开发的算法模型应用到实际场景中去的过程。这个过程通常需要在计算机、服务器或其它硬件设备上面运行算法模型,并编写一些代码来调用模型。任何模型其实都会涉及到模型部署任务,其实你在调用现成的API接口做推理的过程也可以叫做模型部署。模型…

行锁,如何减少锁对性能的影响

什么是行锁? MySQL 的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁,比如MyISAM 引擎就不支持行锁。不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何时刻只能有一个更新在执行,这就会影响到业务并发度。InnoDB 是支持行锁的,…