热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:c#string插值

篇首语:本文由编程笔记#小编为大家整理,主要介绍了c#-string插值相关的知识,希望对你有一定的参考价值。1

篇首语:本文由编程笔记#小编为大家整理,主要介绍了c#-string 插值相关的知识,希望对你有一定的参考价值。



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[])

​​


推荐阅读
  • 本文翻译自:WhatisaMavenartifact?什么是神器?为什么Maven需要它?#1楼参考:https:sta ... [详细]
  • 前端微服务二
    为了解决庞大的一整块后端服务带来的变更与扩展方面的限制,出现了微服务架构(Microservices):微服务是面向服务架构(SOA)的一种变体,把应用程序设计成一系列松耦合的细粒 ... [详细]
  • 使用RSACryptoServiceProvider进行公钥加密我已经在CodeProject上发表了一篇文章,解释了如何使用RSA提供程序进行加密和解密:RSA私钥加密虽然200 ... [详细]
  • java内存模型浅析_浅析Java内存模型
    在并发编程中,需要处理两个关键问题:线程之间如何通信以及线程之间如何同步。通信是指线程之间以何种机制来交换信息。同步是指程序中用于控制不同线程间操作发生 ... [详细]
  • 淘宝http:ip.taobao.cominstructions.php接口说明请求接口(GET):servicegetIpInfo.ph ... [详细]
  • 《每个设计师都应该掌握的50个css代码段》11~20段
    2019独角兽企业重金招聘Python工程师标准11.胶卷边框img.polaroid{background:#000;*Changethistoabackgroundima ... [详细]
  • ———Java培训、Android培训、iOS培训、.Net培训、期待与您交流!———一、引用计数器每个OC对象都有自己的引用计数器,表示“对象被引用 ... [详细]
  • 小编给大家分享一下python怎么获取引用对象的个数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有 ... [详细]
  • spotify engineering culture part 1
    原文,因为原视频说的太快太长,又没有字幕,于是借助youtube,把原文听&打出来了。中文版日后有时间再翻译。oneofthebigsucceessfactorshereatSpo ... [详细]
  • rtemsapi用户指南Elixir代表了相对较新的编程语言,面向更广泛的受众。它于2011年发布,此后一直在开发中。他的主要特征是取消功能范式 ... [详细]
  • 开发笔记:Xunit测试使用个人小结
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Xunit测试使用个人小结相关的知识,希望对你有一定的参考价值。因工作中用到xunit测试,故总结下用法,以供个人参考使 ... [详细]
  • 阿里云大数据计算服务MaxCompute (原名 ODPS)
     MaxCompute是阿里EB级计算平台,经过十年磨砺,它成为阿里巴巴集团数据中台的计算核心和阿里云大数据的基础服务。去年MaxCompute做了哪些工作,这些工作背后的原因是什 ... [详细]
  • #import挂载对象所需要的参数(UIAlertView挂载对象)staticconstcharkRepresente ... [详细]
  • CAS介绍CAS(CentralAuthenticationService),是耶鲁大学开发的单点登录系统(SSO,singlesign-on),应用广泛,具有独立于平台的,易于理解,支持代 ... [详细]
  • 在实际的工作流业务开发中,当用户完成当前用户任务时,需要指定下一个用户任务的审核人。此时我们需要获取下一个节点的一些信息,来确定下一个用户任务的审核人有哪些。在实际工 ... [详细]
author-avatar
哭着说再见0
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有