您的位置:首页 > 编程语言 > C#

C#6.0的语法<二>

2015-01-12 12:34 190 查看
一:字符串嵌入值

  我想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 }




 

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

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: