C# 类型转换is和as 以及性能陷阱
2014-08-29 22:36
519 查看
1.在C#2.0之前,as只能用于引用类型。而在C#2.0之后,它也可以用于可空类型。其结果为可空类型的某个值---空值或者一个有意义的值。 示例:
static void Main(string[] args) { PrintValueInt32(5); PrintValueInt32("some thing!"); } static void PrintValueInt32(object o) { int? nullable = o as int?; //as类型转换,如果转换成功,nullable的HasValue是true,Value中存储的值就是转换后的值。 Console.WriteLine(nullable.HasValue ? nullable.Value.ToString() : "null"); }
输出:
这样只需要一步,就可以安全的将任意引用类型转换为值类型。而在C#1.0中,你只能先使用is操作符,然后再轻质转换,这使CLR执行两次的类型检查,显然is和强类型转换不够优雅。
2.我一直以为执行一次的检查会比两次快。实际上真的如此吗?那就来测试一下吧。
static void Main(string[] args) { List<object> listobj = new List<object>(); List<int?> list = new List<int?>(); for (int i = 0; i < 100000; i++) { listobj.Add(i); } Stopwatch watch = new Stopwatch(); //测试时间类 watch.Start(); foreach (var item in listobj) { if (item is int) //is和强类型转换 { list.Add((int)item); } } watch.Stop(); Console.WriteLine("is检查和强类型转换时间:{0}", watch.Elapsed); watch.Reset(); watch.Start(); foreach (var item in listobj) { int? temp = item as int?; //as转换和空值判断, if (temp.HasValue) //此处也可用temp!=null来判断 { //因为temp是可空类型,有HasValue和Value等可用于对可空类型的操作 list.Add(temp); } } watch.Stop(); Console.WriteLine("as转换时间: {0}", watch.Elapsed); Console.ReadKey(); }
输出:
从输出的结果看,使用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的值)
代码示例二,first为空时,second的值整个表达式的值。
int? first = null; int? second = 4; int? temp = first ?? second; Console.WriteLine("{0}", (temp.HasValue ? temp.Value.ToString() : "null"));
输出:
参考:《深入理解C#》(第三版) 作者:jon steek[英],译者:姚麒麟
相关文章推荐
- [C#] as 和 is 运算符以及安全的类型强制转换
- C# 类型转换以及is、as
- [C#] as 和 is 运算符以及安全的类型强制转换
- C#的as, is和类型强制转换
- C#语言学习--基础部分(十二) --堆,栈,装箱,拆箱,安全数据类型转换:as, is
- C#中数据类型的安全转换(is,as)
- C#中数据类型的安全转换(is,as)
- c# as is 类型转换
- c# as is 类型转换
- 写几个带继承关系的类,使用直接强转的方式,以及使用as转换, 并且练习is的类型判断
- c# as is 类型转换
- C# is\as与强制转换的区别+值类型与引用类型转换区别
- C#的 is 和 as 类型转换
- c# as is 类型转换
- is和as在类型转换时的性能差异
- C#引用类型转换,到底使用is,as还是显式强转?
- C#类型转换、is、as、单问号、双问号解密
- C#类型转换、is、as、单问号、双问号解密
- c# as is 类型转换
- c# as is 类型转换