阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

c#-string 插值

327次阅读
没有评论

共计 2984 个字符,预计需要花费 8 分钟才能阅读完成。

1. 老版本的代码
1 internal class Person
 2 {3     public string Name { get; set;}
 4     public int Age {get; set;}
 5 
 6     public override string ToString()
 7     {8         return string.Format("[name={0},age={1}]", Name, Age);
 9     }
10 }

通常我们在格式化字符串的时候会使用 string 的静态方法 Format 来进行字符串拼接,然后使用 {0}…{n} 来充当占位符。如果 {n} 过大,代码的可读性就会急剧下降,C#6 引入一个新语法来简化这种书写方式。

2. $”{xxx:}”

我们之间来看新语法:

1 internal class Person
 2 {3     public string Name { get; set;}
 4     public int Age {get; set;}
 5 
 6     public override string ToString()
 7     {8         return $"[name={Name},age={Age}]";
 9     }
10 }

新语法采用 $ 开头,然后把之前的 {n} 换成了有意义的表达式,直观且简洁,且在 VS2015 中会有智能提示。好了,基本用法就是这样,按老习惯,对比下 IL 代码吧。

老版本的 IL:

1 .method public hidebysig virtual instance string 
 2         ToString() cil managed
 3 {4   // Code size       33 (0x21)
 5   .maxstack  3
 6   .locals init ([0] string V_0)
 7   IL_0000:  nop
 8   IL_0001:  ldstr      "[name={0},age={1}]"
 9   IL_0006:  ldarg.0
10   IL_0007:  call       instance string csharp6.Person::get_Name()
11   IL_000c:  ldarg.0
12   IL_000d:  call       instance int32 csharp6.Person::get_Age()
13   IL_0012:  box        [mscorlib]System.Int32
14   IL_0017:  call       string [mscorlib]System.String::Format(string,
15                                                               object,
16                                                               object)
17   IL_001c:  stloc.0
18   IL_001d:  br.s       IL_001f
19   IL_001f:  ldloc.0
20   IL_0020:  ret
21 } // end of method Person::ToString

新语法的 IL:

1 .method public hidebysig virtual instance string 
 2         ToString() cil managed
 3 {4   // Code size       33 (0x21)
 5   .maxstack  3
 6   .locals init ([0] string V_0)
 7   IL_0000:  nop
 8   IL_0001:  ldstr      "[name={0},age={1}]"
 9   IL_0006:  ldarg.0
10   IL_0007:  call       instance string csharp6.Person::get_Name()
11   IL_000c:  ldarg.0
12   IL_000d:  call       instance int32 csharp6.Person::get_Age()
13   IL_0012:  box        [mscorlib]System.Int32
14   IL_0017:  call       string [mscorlib]System.String::Format(string,
15                                                               object,
16                                                               object)
17   IL_001c:  stloc.0
18   IL_001d:  br.s       IL_001f
19   IL_001f:  ldloc.0
20   IL_0020:  ret
21 } // end of method Person::ToString

第一眼看到新版本的 IL 代码,我还以为我没有重新编译我的代码。C# 编译器帮我们转成了老版本的写法而已,一模一样的。。。so, 这又是一个语法层面的优化。

3. Example
1 // 支持方法调用
 2 string s1 = $"{person.GetHashCode()}";
 3 // 支持表达式
 4 string s2 = $"person.{nameof(person.Name)} is {person?.Name}";
 5 // 支持格式化输出
 6 DateTime now = DateTime.Now;
 7 string s3 = $"DateTime.Now={now:yyyy-MM-dd HH:mm:ss}";
 8 // 组合表达式和格式化输出
 9 string s4 = $"{person.Name,2} is {person.Age:D2} year{(person.Age == 1 ?"" : "s")} old.";
10 // 支持的隐式类型转换
11 IFormattable s5 = $"Hello, {person.Name}";
12 FormattableString s6 = $"Hello, {person.Name}"

新语法支持表达式求值,支持: 格式化操作,还支持到 IFormattable 的隐式转换,编译结果是利用 System.Runtime.CompilerServices.FormattableStringFactory.Create 这个静态方法构造一个 FormattableString 实现的。IL 如下:

1 IL_0095:  stloc.s s4
 2 IL_0097:  ldstr      "Hello, {0}"
 3 IL_009c:  ldc.i4.1
 4 IL_009d:  newarr[mscorlib] System.Object
 5 IL_00a2:  dup
 6 IL_00a3:  ldc.i4.0
 7 IL_00a4:  ldloc.0
 8 IL_00a5:  callvirt instance string csharp6.Person::get_Name()
 9 IL_00aa:  stelem.ref
10 IL_00ab:  call class [mscorlib]System.FormattableString[mscorlib] System.Runtime.CompilerServices.FormattableStringFactory::Create(string,object[])
13 IL_00b0:  stloc.s s5
14 IL_00b2:  ldstr      "Hello, {0}"
15 IL_00b7:  ldc.i4.1
16 IL_00b8:  newarr[mscorlib] System.Object
17 IL_00bd:  dup
18 IL_00be:  ldc.i4.0
19 IL_00bf:  ldloc.0
20 IL_00c0:  callvirt instance string csharp6.Person::get_Name()
21 IL_00c5:  stelem.ref
22 IL_00c6:  call class [mscorlib]System.FormattableString[mscorlib] System.Runtime.CompilerServices.FormattableStringFactory::Create(string,object[])

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计2984字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7805880
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
使用1Panel面板搭建属于你的AI项目环境

使用1Panel面板搭建属于你的AI项目环境

使用 1Panel 面板搭建属于你的 AI 项目环境 在 AI 项目越来越火的今天,很多朋友都想自己动手搭建一...
如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的 Nano Banana Pro?附赠邪修的用法 前言 大家好,我是星哥,今天来介绍谷歌的 ...
CSDN,你是老太太喝粥——无齿下流!

CSDN,你是老太太喝粥——无齿下流!

CSDN,你是老太太喝粥——无齿下流! 大家好,我是星哥,今天才思枯竭,不写技术文章了!来吐槽一下 CSDN。...
安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装 Black 群晖 DSM7.2 系统安装教程(在 Vmware 虚拟机中、实体机均可)! 前言 大家好,...
星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛 NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手! 作为动漫爱好者,你是否还在为...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

  星哥带你玩飞牛 NAS-16:飞牛云 NAS 换桌面,fndesk 图标管理神器上线! 引言 哈...
自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个 AI 智能体 — 跟创业大佬对话 前言 智能体(Agent)已经成为创业者和技术人绕...
国产开源公众号AI知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率

国产开源公众号AI知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率

国产开源公众号 AI 知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率 大家好,我是星哥,...
4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

  4 盘位、4K 输出、J3455、遥控,NAS 硬件入门性价比之王 开篇 在 NAS 市场中,威...
多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞...