看看C# 6.0中那些语法糖都干了些什么(中篇)

  接着上篇继续扯,其实语法糖也不是什么坏事,第一个就是吃不吃随你,第二个就是最好要知道这些糖在底层都做了些什么,不过有一点

叫眼见为实,这样才能安心的使用,一口气上五楼,不费劲。

一:字符串嵌入值

  我想String.Format方法就是化成灰大家都认识,比如下面代码:

1     class Bird
2     {
3         private string Name = "swallow";
4
5         public void Fly()
6         {
7             var result = string.Format("hello {0}", Name);
8         }
9     }

  这个Format有一个不好的地方就是,如果占位符太多,就特别容易搞错,如果你少了一个参数,代码就会报错。

接下来跟趟顺风车,去看看string.Format底层代码,还是蛮惊讶的发现,其实底层不过调用的就是StirngBuilder.AppendFormat方法。

因为容易报错,所以为了保险起见就用字符串拼接的方式来实现,但是我也知道字符串拼接是耗时的一种操作,写个StringBuilder又嫌麻烦,

还好C#6.0中提供了一种新鲜玩法,先看代码:

 1     class Bird
 2     {
 3         private string Name = "swallow";
 4
 5         public void Fly()
 6         {
 7             //var result = string.Format("hello {0}{1}", Name);
 8
 9             var result = "\{"hello"}:\{Name}";
10
11             Console.WriteLine(result);
12         }
13     }

然后就迫不及待的去看看底层怎么玩的,其实在下面的IL图中可以看到,在底层最终还是调用了String.Format方法来实现的。

二:using静态类

  这种写法看起来有点不伦不类的,乍一看也没有什么用处,不过可以告诉我们一个原理,就是不管你上层怎么变,编译器还是一样使用

全命名,这就叫万变不离其宗吧。

三:空值判断

  先还是来看看这种玩法的真容。

1     class Bird
2     {
3         public void Fly(string name)
4         {
5             var result = name?.Length;
6         }
7     }

是不是看着有点眼晕?那就对了,编译器就是这样静静的端着碗看着我们写这些装逼的代码,不过再怎么装逼,也逃不过ILdasm的眼睛。

其实仔细看IL代码之后,觉得一切还是那么的熟悉,重点就是这个brtrue.s。它的状态也决定了两条执行流,不过在IL上面也看到了V_1这个编译

器给我们单独定义的一个变量,代码还原如下:

 1     class Bird
 2     {
 3         public void Fly(string name)
 4         {
 5             int? r;
 6
 7             if (name == null)
 8             {
 9                 int? V_1 = new Nullable<int>();
10
11                 r = V_1;
12             }
13             else
14             {
15                 r = new Nullable<int>(name.Length);
16             }
17         }
18     }

四:nameof表达式

  当我知道这个关键字的用途时,我的第一反应就是公司框架里面的LogManager类,当我们new LogManager的时候,会同时把当前的类名

传递下去,然后做些后期处理,但是在以前我们只能这么做,要么用反射,要么写死。

 1 namespace ConsoleApplication3
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             //第一种:使用反射
 8             var ilog = new LoggerManager(typeof(Program));
 9
10             //第二种:写死
11             ilog = new LoggerManager("Program");
12
13             Console.WriteLine("world");
14         }
15     }
16
17     class LoggerManager
18     {
19         /// <summary>
20         /// 构造函数记录下类名
21         /// </summary>
22         /// <param name="type"></param>
23         public LoggerManager(Type type)
24         {
25             //todo
26             Console.WriteLine(type.Name);
27         }
28         public LoggerManager(string className)
29         {
30             //todo
31             Console.WriteLine(className);
32         }
33     }
34 }

我想大家也能看到,第一种使用了反射,这是需要读取元数据的,性能你懂的,第二个虽然是字符串,你也看到了,是写死的方式,这个时候就

急需一个加强版,就像下面这样。

看到IL后,反正我是鸡动了。。。nameof具有上面两者的优点,既灵活,性能又高。。。。不错不错,赞一下。

时间: 2024-10-18 16:52:08

看看C# 6.0中那些语法糖都干了些什么(中篇)的相关文章

看看C# 6.0中那些语法糖都干了些什么(终结篇)

终于写到终结篇了,整个人像在梦游一样,说完这一篇我得继续写我的js系列啦. 一:带索引的对象初始化器 还是按照江湖老规矩,先扒开看看到底是个什么玩意. 1 static void Main(string[] args) 2 { 3 Dictionary<string, string> dic = new Dictionary<string, string>() 4 { 5 ["Name"] = "ctrip", 6 ["Age&qu

看看C# 6.0中那些语法糖都干了些什么(上篇)

今天没事,就下了个vs2015 preview,前段时间园子里面也在热炒这些新的语法糖,这里我们就来看看到底都会生成些什么样的IL? 一:自动初始化属性 确实这个比之前的版本简化了一下,不过你肯定很好奇,到底编译器给我们做了哪些东西呢? 1 class Student 2 { 3 public string Name { get; set; } = "ctrip"; 4 } 从这张图中可以看到,在ctor中<Name>k__backingfield=“ctrip“的赋值在b

js中的new关键字都干了些什么?

new 操作符 在有上面的基础概念的介绍之后,在加上new操作符,我们就能完成传统面向对象的class + new的方式创建对象,在javascript中,我们将这类方式成为Pseudoclassical.基于上面的例子,我们执行如下代码   var obj = new Base(); 这样代码的结果是什么,我们在Javascript引擎中看到的对象模型是: new操作符具体干了什么呢?其实很简单,就干了三件事情. var obj  = {}; obj.__proto__ = Base.prot

JVM(二):Java中的语法糖

JVM(二):Java中的语法糖 上文讲到在语义分析中会对Java中的语法糖进行解糖操作,因此本文就主要讲述一下Java中有哪些语法糖,每个语法糖在解糖过后的原始代码,以及这些语法糖背后的逻辑. 语法糖 语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用.通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会.

【Java基础】Java中的语法糖

目录 Java中的语法糖 switch对String和枚举类的支持 对泛型的支持 包装类型的自动装箱和拆箱 变长方法参数 枚举 内部类 条件编译 断言 数值字面量 for-each try-with-resource Lambda表达式 Lambda表达式的语法 基本的Lambda例子(实现功能接口) 使用Lambdas排序集合 使用Lambdas和Streams 字符串对+号的支持 参考 语法糖(Syntactic Sugar),也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言本身

C# 7.0中可能出现的语法

今天在MSDN上看到的微软关于微软关于C# 7.0特性的Work List,主要特性如下: Tuple增强 Tuple的可读性一直不是很好, 很多时候宁愿新写一个类也不使用Item1, Item2这种不知何物的属性: ????public Tuple<int, int> Tally(IEnumerable<int> values) { ... }????var t = Tally(myValues);????Console.WriteLine($"Sum: {t.Item

Java 中的语法糖

定义:指的是,在计算机语言中添加某种语法,这种语法能使程序员更方便的使用语言开发程序,同时增强程序代码的可读性,避免出错的机会:但是这种语法对语言的功能并没有影响.Java中的泛型,变长参数,自动拆箱/装箱,条件编译等都是 泛型:ava的泛型只在源代码存在,只供编辑器检查使用,编译后的字节码文件已擦除了泛型类型 public static void main(String[] args) { List<String> stringList = new ArrayList<String&g

vue项目中快捷语法糖

1.Vue.js是渐进式框架,采用自底向上增量开发的设计基于MVVM思想. 2.Vue 完全有能力驱动采用单文件组件和Vue生态系统支持的库开发的复杂单页应用. 3.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. 4.指令带有前缀 v-,以表示它们是 Vue.js 提供的特殊属性. 5.站点上动态渲染的任意 HTML 可能会非常危险,因为它很容易导致 XSS 攻击. 6.请只对可信内容使用 HTML 插值,绝不要对用户提供的内容插值. 7.当一个 ViewM

C# 中的语法糖

1.   using 代替了 try-catch-finally 因为之前是学 Java 的,在连接数据库或者进行文件读写操作时很自然的就使用了 try-catch-finally-,在 C# 中这样写也肯定可以但是还有一种更优雅的写法(我看到别人这样说),那就是使用 using 关键字. 在使用各种流或者连接时[文件读写流,数据库连接等等],在使用完毕后,需要关闭流和连接,(这里不讨论数据库连接需要归还到池子) 之前的代码是这样的: public void Test1() { SqlConne