C#6.0的语法<二>
来源:互联网 发布:知聊色情聊天 编辑:程序博客网 时间:2024/06/03 15:53
一:字符串嵌入值
我想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有一个不好的地方就是,如果占位符太多,就特别容易搞错,如果你少了一个参数,代码就会报错。
接下来跟趟顺风车,去看看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 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 else14 {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 LoggerManager18 {19 /// <summary>20 /// 构造函数记录下类名21 /// </summary>22 /// <param name="type"></param>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 }
我想大家也能看到,第一种使用了反射,这是需要读取元数据的,性能你懂的,第二个虽然是字符串,你也看到了,是写死的方式,这个时候就
急需一个加强版,就像下面这样。
- C#6.0的语法<二>
- C#6.0的语法<一>
- C#6.0的语法<三>
- C# 语法参考(二 )
- C#2.0基本语法二
- C#语法笔记(二)
- C# 6.0语法新特性体验(二)
- C#的基本语法
- C#语法的学习方法
- C#语法的学习方法
- c#的基本语法
- C#简单的语法
- c# 特殊的语法
- C#的基本语法
- C#的语法结构
- C#的语法
- C# 的基本语法
- 二、C#学习基础篇----基础语法
- 下次V
- 本人csdn、iteye、oschina等三个博客同时更新撰写文章,大家都可以看
- ORA-12541:TNS:无监听程序
- 通过Dispatch Group机制,根据系统资源状况来执行任务
- 天声人語 20150112
- C#6.0的语法<二>
- Java Socket接收和发送(字符串)
- C#6.0的语法<三>
- 日经春秋 20150112
- 前端JS全屏弹动浮窗代码实现
- Hadoop压缩codec
- 日经社説 20150112 注目したいトヨタの特許戦略
- 离线升级Cloudera Manager(CM)和Cloudera Data Hub(CDH)
- Same Tree