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


       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?;   //as类型转换,如果转换成功,nullable的HasValue是true,Value中存储的值就是转换后的值。
    10             Console.WriteLine(nullable.HasValue ? nullable.Value.ToString() : "null");
    11         }
        输出:

     

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

     

     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         }       

     输出:

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

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

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

             (1)对first进行求值。        

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

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

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

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

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

          代码示例二,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"));

          输出:

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

  • 相关阅读:
    Ray聊天记录
    ServiceFabric极简文档-5.0 Service Fabric有状态与无状态
    ServiceFabric极简文档-5.1 编程模型选择
    Java网络编程学习A轮_08_NIO的Reactor模型
    Java网络编程学习A轮_07_基于Buffer的Socket编程
    Java网络编程学习A轮_06_NIO入门
    Java网络编程学习A轮_05_Socket编程
    Spring IOC 源码简单分析 04
    Spring IOC 源码简单分析 03
    Spring IOC 源码简单分析 02
  • 原文地址:https://www.cnblogs.com/zhangyuanbo12358/p/3945836.html
Copyright © 2020-2023  润新知