[C#6] 4-string 插值
0. 目录
1. 老版本的代码
internal class Person
{
public string Name { get; set; }
public int Age { get; set; } public override string ToString()
{
return string.Format("[name={0},age={1}]", Name, Age);
}
}
通常我们在格式化字符串的时候会使用string的静态方法Format来进行字符串拼接,然后使用{0}...{n}来充当占位符。如果{n}过大,代码的可读性就会急剧下降,C#6引入一个新语法来简化这种书写方式。
2. $"{xxx:}"
我们之间来看新语法:
internal class Person
{
public string Name { get; set; }
public int Age { get; set; } public override string ToString()
{
return $"[name={Name},age={Age}]";
}
}
新语法采用 $ 开头,然后把之前的{n}换成了有意义的表达式,直观且简洁,且在VS2015中会有智能提示。好了,基本用法就是这样,按老习惯,对比下IL代码吧。
老版本的IL:
.method public hidebysig virtual instance string
ToString() cil managed
{
// Code size 33 (0x21)
.maxstack
.locals init ([] string V_0)
IL_0000: nop
IL_0001: ldstr "[name={0},age={1}]"
IL_0006: ldarg.
IL_0007: call instance string csharp6.Person::get_Name()
IL_000c: ldarg.
IL_000d: call instance int32 csharp6.Person::get_Age()
IL_0012: box [mscorlib]System.Int32
IL_0017: call string [mscorlib]System.String::Format(string,
object,
object)
IL_001c: stloc.
IL_001d: br.s IL_001f
IL_001f: ldloc.
IL_0020: ret
} // end of method Person::ToString
新语法的IL:
.method public hidebysig virtual instance string
ToString() cil managed
{
// Code size 33 (0x21)
.maxstack
.locals init ([] string V_0)
IL_0000: nop
IL_0001: ldstr "[name={0},age={1}]"
IL_0006: ldarg.
IL_0007: call instance string csharp6.Person::get_Name()
IL_000c: ldarg.
IL_000d: call instance int32 csharp6.Person::get_Age()
IL_0012: box [mscorlib]System.Int32
IL_0017: call string [mscorlib]System.String::Format(string,
object,
object)
IL_001c: stloc.
IL_001d: br.s IL_001f
IL_001f: ldloc.
IL_0020: ret
} // end of method Person::ToString
第一眼看到新版本的IL代码,我还以为我没有重新编译我的代码。C#编译器帮我们转成了老版本的写法而已,一模一样的。。。so,这又是一个语法层面的优化。
3. Example
//支持方法调用
string s1 = $"{person.GetHashCode()}";
//支持表达式
string s2 = $"person.{nameof(person.Name)} is {person?.Name}";
//支持格式化输出
DateTime now = DateTime.Now;
string s3 = $"DateTime.Now={now:yyyy-MM-dd HH:mm:ss}";
//组合表达式和格式化输出
string s4 = $"{person.Name,2} is {person.Age:D2} year{(person.Age == 1 ? "" : "s")} old.";
//支持的隐式类型转换
IFormattable s5 = $"Hello, {person.Name}";
FormattableString s6 = $"Hello, {person.Name}"
新语法支持表达式求值,支持:格式化操作,还支持到IFormattable的隐式转换,编译结果是利用 System.Runtime.CompilerServices.FormattableStringFactory.Create 这个静态方法构造一个 FormattableString 实现的。IL如下:
IL_0095: stloc.s s4
IL_0097: ldstr "Hello, {0}"
IL_009c: ldc.i4.1
IL_009d: newarr[mscorlib] System.Object
IL_00a2: dup
IL_00a3: ldc.i4.0
IL_00a4: ldloc.0
IL_00a5: callvirt instance string csharp6.Person::get_Name()
IL_00aa: stelem.ref
IL_00ab: call class [mscorlib]System.FormattableString[mscorlib] System.Runtime.CompilerServices.FormattableStringFactory::Create(string,object[])
IL_00b0: stloc.s s5
IL_00b2: ldstr "Hello, {0}"
IL_00b7: ldc.i4.1
IL_00b8: newarr[mscorlib] System.Object
IL_00bd: dup
IL_00be: ldc.i4.0
IL_00bf: ldloc.0
IL_00c0: callvirt instance string csharp6.Person::get_Name()
IL_00c5: stelem.ref
IL_00c6: call class [mscorlib]System.FormattableString[mscorlib] System.Runtime.CompilerServices.FormattableStringFactory::Create(string,object[])
4. 参考
[C#6] 4-string 插值的更多相关文章
- C#6新特性,让你的代码更干净
前言 前几天看一个朋友的博客时,看他用到了C#6的特性,而6出来这么长时间还没有正儿八经看过它,今儿专门看了下新特性,说白了也不过是语法糖而已.但是用起来确实能让你的代码更加干净些.Let's try ...
- [C#6] 0-概览
1. C#6 新特性图谱 C#6的新特性主要由编译器(“Roslyn”)带来,并不依赖CLR和.NET Framework的升级,我们可以认为这个版本的新语言特性的主要目的为了简化代码书写方式,让我们 ...
- JVM 平台上的各种语言的开发指南
JVM 平台上的各种语言的开发指南 为什么我们需要如此多的JVM语言? 在2013年你可以有50中JVM语言的选择来用于你的下一个项目.尽管你可以说出一大打的名字,你会准备为你的下一个项目选择一种新的 ...
- Groovy中String转换Gstring用于动态插值
知识点是Groovy中的模板引擎 GStringTemplateEngine 第一个例子: def binding = [ firstname : "Grace", lastnam ...
- 窥探Swift之字符串(String)
之前总结过Objective-C中的字符串<Objective-C精选字符串处理方法>,学习一门新语言怎么能少的了字符串呢.Swift中的String和Objective-C语言中NSSt ...
- 用JAVA实现插值查询的方法(算近似值,区间求法)
插值查询:如果有这样一张表,有一列叫水位,有一列叫库容,比如下面的图. 我现在想做这么一件事情:对于这个测站而言,当我输入某一个水位或者库容的时候,想要查询到对应的水位或者库容呢? 而这个值不一定是存 ...
- 关于IDW空间插值
空间插值一般都会用到IInterPolationOP接口等 首先是通过图层的名称获取图层的方法: private ILayer GetLayerByName(string name) { ...
- 你需要知道的Sass插值
你也许会不时地写写 Sass 玩玩,你也会很享受它带给你各种便利.但还有一件事,你并不一定完全了解:插值 (interpolation) - 将一个占位符,替换成一个值.好了,你们都很幸运,因为今天我 ...
- iOS -Swift 3.0 -String(字符串常规用法)
// // ViewController.swift // Swift-String // // Created by luorende on 16/9/10. // Copyright © 2016 ...
- iOS - Swift String 字符串
前言 public struct String public class NSString : NSObject, NSCopying, NSMutableCopying, NSSecureCodin ...
随机推荐
- (转)运维角度浅谈MySQL数据库优化
转自:http://lizhenliang.blog.51cto.com/7876557/1657465 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架 ...
- 如何使用Xmanager及VNC登录远程桌面
如何调用远程桌面,比较常见的有两种方式:Xmanager及VNC 正好今天鼓捣了一下,特整理如下: Xmanager Xmanager的调用也有两种方式: 一.直接在Xshell中调用 这时需设置会话 ...
- 如何用 js 获取table 或者其他块状标签的 宽和高
这个比较简单,总体思想,标签标记一个id,js获取id,就能用它的属性了.介绍两种方法.请看下面代码. 第一种 <script> function width_table_all() { ...
- Blob初探
简介 Blob在js中意味着二进制大数据.实现该接口的对象有3个属性,分别是type(MIME),size(byte)和 一个切割方法:slice(在大文件分片上传可能用到).另外,File实现了Bl ...
- ASP.NET MVC5中View-Controller间数据的传递
使用ASP.NET MVC做开发时,经常需要在页面(View)和控制器(Controller)之间传递数据,那么都有哪些数据传递的方式呢? 本文对于View向Controller中传值共列举了以下几种 ...
- 关系数据库SQL之可编程性函数(用户自定义函数)
前言 在关系型数据库中除了前面几篇基本的数据库和数据表操作之外,还提供了可编程性的函数.存储过程.事务.触发器及游标. 本文介绍的是函数. 函数分为两种: 系统函数 用户自定义函数 准备工作 这里以银 ...
- 【转】asp.net(c#)加密解密算法之sha1、md5、des、aes实现源码详解
原文地址:http://docode.top/Article/Detail/10003 目录: 1..Net(C#)平台下Des加密解密源代码 2..Net(C#)平台下Aes加密解密源代码 3..N ...
- Extjs Panel
刚学习Extjs @{ Layout = "~/_SiteLayout.cshtml"; Page.Title = "欢迎访问我的网站!"; } @{ stri ...
- MesaSQLite数据库的简单使用方法
前言部分 本文非原创 文章摘自:http://m.blog.csdn.net/blog/wsxzk123/17282325 数据库工具:MesaSQLite 一.创建数据库 1.创建数据库 MesaS ...
- 尝试加载 Oracle 客户端库时引发 BadImageFormatException
尝试加载 Oracle 客户端库时引发 BadImageFormatException 工程师给计算机诊断,就像医生给病人诊断一样,很多同样的症状,可能是由多种截然不同的原因导致的. 最近进行C# ...