0. 目录

C#6 新增特性目录

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. 参考

Interpolated Strings

[C#6] 4-string 插值的更多相关文章

  1. C#6新特性,让你的代码更干净

    前言 前几天看一个朋友的博客时,看他用到了C#6的特性,而6出来这么长时间还没有正儿八经看过它,今儿专门看了下新特性,说白了也不过是语法糖而已.但是用起来确实能让你的代码更加干净些.Let's try ...

  2. [C#6] 0-概览

    1. C#6 新特性图谱 C#6的新特性主要由编译器(“Roslyn”)带来,并不依赖CLR和.NET Framework的升级,我们可以认为这个版本的新语言特性的主要目的为了简化代码书写方式,让我们 ...

  3. JVM 平台上的各种语言的开发指南

    JVM 平台上的各种语言的开发指南 为什么我们需要如此多的JVM语言? 在2013年你可以有50中JVM语言的选择来用于你的下一个项目.尽管你可以说出一大打的名字,你会准备为你的下一个项目选择一种新的 ...

  4. Groovy中String转换Gstring用于动态插值

    知识点是Groovy中的模板引擎 GStringTemplateEngine 第一个例子: def binding = [ firstname : "Grace", lastnam ...

  5. 窥探Swift之字符串(String)

    之前总结过Objective-C中的字符串<Objective-C精选字符串处理方法>,学习一门新语言怎么能少的了字符串呢.Swift中的String和Objective-C语言中NSSt ...

  6. 用JAVA实现插值查询的方法(算近似值,区间求法)

    插值查询:如果有这样一张表,有一列叫水位,有一列叫库容,比如下面的图. 我现在想做这么一件事情:对于这个测站而言,当我输入某一个水位或者库容的时候,想要查询到对应的水位或者库容呢? 而这个值不一定是存 ...

  7. 关于IDW空间插值

    空间插值一般都会用到IInterPolationOP接口等 首先是通过图层的名称获取图层的方法: private ILayer GetLayerByName(string name)        { ...

  8. 你需要知道的Sass插值

    你也许会不时地写写 Sass 玩玩,你也会很享受它带给你各种便利.但还有一件事,你并不一定完全了解:插值 (interpolation) - 将一个占位符,替换成一个值.好了,你们都很幸运,因为今天我 ...

  9. iOS -Swift 3.0 -String(字符串常规用法)

    // // ViewController.swift // Swift-String // // Created by luorende on 16/9/10. // Copyright © 2016 ...

  10. iOS - Swift String 字符串

    前言 public struct String public class NSString : NSObject, NSCopying, NSMutableCopying, NSSecureCodin ...

随机推荐

  1. etlpy: 并行爬虫和数据清洗工具(开源)

    etlpy是python编写的网页数据抓取和清洗工具,核心文件etl.py不超过500行,具备如下特点 爬虫和清洗逻辑基于xml定义,不需手工编写 基于python生成器,流式处理,对内存无要求 内置 ...

  2. 数据结构:C_链表队列的实现

    数据结构链表形式队列的实现(C语言版) 1.写在前面 队列是一种和栈相反的,遵循先进先出原则的线性表. 本代码是严蔚敏教授的数据结构书上面的伪代码的C语言实现代码. 分解代码没有包含在内的代码如下: ...

  3. 重温JSP学习笔记--与日期数字格式化有关的jstl标签库

    上一篇笔记写的主要是JSTL的core标签库,如果想对一些数字或者日期做一些操作或者在网页上显示指定格式的数字或日期,jstl还提供了另一个fmt标签库,这里简单介绍一下: 第一步,导入标签库: &l ...

  4. WebGIS中利用AGS JS+eChart实现一些数据展示的探索

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 eChart提供了迁徙图.热点图.夜视图等跟地图能够很好的结 ...

  5. C#常用的IO操作方法

    public class IoHelper { /// <summary> /// 判断文件是否存在 /// </summary> /// <param name=&qu ...

  6. jQuery-1.9.1源码分析系列(十四) 一些jQuery工具

    为了给下一章分析动画处理做准备,先来看一下一些工具.其中队列工具在动画处理中被经常使用. jQuery.fn. queue(([ queueName ] [, newQueue ]) || ([ qu ...

  7. Linux iptables原理--数据包流向

    Iptable与Netfilter 在上一篇文章 linux iptables常用命令--配置一个生产环境的iptables 我们知道iptables有好几个表,如raw,mangle,nat,fil ...

  8. WPF透明设置(Opacity)

    <TextBlock Text="阴影效果" FontSize="32"></TextBlock> <Border Height= ...

  9. [Asp.net 5] Localization-简单易用的本地化

    本地化也叫国际化,就是做多语言程序时,可以一键式将当前语言切换到另外一种语言.对于跨国企业或者和国外有业务往来的公司特别重要:就算一个普通公司的门户如果支持中.英.繁体,也会让人觉得高大上.有没有呀, ...

  10. php中用GD绘制折线图

    php中用GD绘制折线图,代码如下: Class Chart{ private $image; // 定义图像 private $title; // 定义标题 private $ydata; // 定 ...