博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
看看C# 6.0中那些语法糖都干了些什么(中篇)
阅读量:5291 次
发布时间:2019-06-14

本文共 2541 字,大约阅读时间需要 8 分钟。

一:字符串嵌入值

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

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

  这个Format有一个不好的地方就是。假设占位符太多,就特别easy搞错,假设你少了一个參数,代码就会报错。

 

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

 

由于easy报错。所以为了保险起见就用字符串拼接的方式来实现,可是我也知道字符串拼接是耗时的一种操作,写个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 Bird2     {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表达式

  当我知道这个keyword的用途时,我的第一反应就是公司框架里面的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 LoggerManager18     {19         /// 20         /// 构造函数记录下类名21         /// 22         /// 23         public LoggerManager(Type type)24         {25             //todo26             Console.WriteLine(type.Name);27         }28         public LoggerManager(string className)29         {30             //todo31             Console.WriteLine(className);32         }33     }34 }

 

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

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

看到IL后,反正我是鸡动了。

。nameof具有上面两者的长处。既灵活。性能又高。。

。。

不错不错。赞一下。

转载于:https://www.cnblogs.com/claireyuancy/p/6953688.html

你可能感兴趣的文章
stm32 usb调试
查看>>
Debug printf viewer
查看>>
stm32 TIM
查看>>
stm32HAL重要的库
查看>>
深浅cope
查看>>
bat 批量重命名文件 并替换部分字符
查看>>
Centos使用chrony做时间同步
查看>>
tcpreplay命令使用详解
查看>>
转-四层和七层负载均衡的区别
查看>>
docker私有库搭建过程(Registry)
查看>>
kubernetes重置(重装)node的flannel网络
查看>>
etcdctl环境变量设置
查看>>
kubectl patch
查看>>
高中地理思维导图(浙江省学考专用)
查看>>
MySQL---Mybatis 批处理(增,改,删)
查看>>
Date相关处理
查看>>
三种List集合的遍历方式
查看>>
对List集合中的对象进行按某个属性排序
查看>>
MySql查询当天、本周、本月、本季度、本年的数据
查看>>
dashboard安装
查看>>