码迷,mamicode.com
首页 > 其他好文 > 详细

C# 类型转换is和as 以及性能陷阱

时间:2014-08-29 23:50:28      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   使用   ar   for   2014   

   1.在C#2.0之前,as只能用于引用类型。而在C#2.0之后,它也可以用于可空类型。其结果为可空类型的某个值---空值或者一个有意义的值。
示例:
 1   static void Main(string[] args)
 2         {
 3             PrintValueInt32(5);
 4             PrintValueInt32("some thing!");
 5     }
 6     
 7       static void PrintValueInt32(object o)
 8         {
 9             int? nullable = o as int?;
10             Console.WriteLine(nullable.HasValue ? nullable.Value.ToString() : "null");
11         }
    输出:

 bubuko.com,布布扣

  这样只需要一步,就可以安全的将任意引用转换为值。而在C#1.0中,你只能先使用is操作符,然后再轻质转换,这使CLR执行两次的类型检查,显然不够优雅。

 

 2.我一直以为执行一次的检查会比两次快。实际上真的如此吗?那就来测试一下吧。

 

 1 static void Main(string[] args)
 2         { 
 3             List<object> listobj = new List<object>();
 4             List<int?> list = new List<int?>();
 5 
 6             for (int i = 0; i < 100000; i++)
 7             {
 8                 listobj.Add(i);
 9             }
10 
11             Stopwatch watch = new Stopwatch();   //测试时间类
12             watch.Start();
13             foreach (var item in listobj)
14             {
15                 if (item is int)                 //is和强类型转换
16                 {
17                     list.Add((int)item);
18                 }
19             }
20             watch.Stop();
21             Console.WriteLine("is检查和强类型转换时间:{0}", watch.Elapsed);
22 
23             watch.Reset();
24             watch.Start();
25             foreach (var item in listobj)
26             {
27                 int? temp = item as int?;        //as转换和空值判断,
28                 if (temp.HasValue)               //此处也可用temp!=null来判断
29                 {                   //因为temp是可空类型,有HasValue和Value等可用于对可空类型的操作
30                     list.Add(temp);
31                 }
32             }
33             watch.Stop();
34             Console.WriteLine("as转换时间:            {0}", watch.Elapsed);
35             Console.ReadKey();
36         }       

 输出:

bubuko.com,布布扣

  从输出的结果看,使用is检查和强类型转换时间比as转换时间少很多。在进行要频繁在引用类型和值类型之间转换的操作时,谨慎选择,避免掉入性能陷阱。

  3.对于空合并运算符的使用。         

      空合并运算符实在C#2.0中引入的。first??second其执行步骤:        

         (1)对first进行求值。        

         (2)first非空,整个表达式的值就是first的值。        

         (3)否则,求second的值,作为整个表达式的值。

         代码示例一,first不为空时,不管second的值是否为空,整个表达式的值都是first的值:

 

            int? first = 1;
            int? second = 4;
            int? temp = first ?? second;
            Console.WriteLine("{0}", (temp.HasValue ? temp.Value.ToString() : "null"));

        输出:(即使second不是空,因为first非空,所以输出first的值)

bubuko.com,布布扣

      代码示例二,first为空时,second的值整个表达式的值。

 

1             int? first = null;
2             int? second = 4;
3             int? temp = first ?? second;
4             Console.WriteLine("{0}", (temp.HasValue ? temp.Value.ToString() : "null"));

      输出:

bubuko.com,布布扣

                                                                                                          参考:《深入理解C#》(第三版)  作者:jon steek[英],译者:姚麒麟

C# 类型转换is和as 以及性能陷阱

标签:style   blog   http   color   os   使用   ar   for   2014   

原文地址:http://www.cnblogs.com/zhangyuanbo12358/p/3945836.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!