C#基础知识_类型转换
1. 转换的种类
1)转换的种类,如下图:
2)强制(显示)转换和隐式转换
2. checked&uncheked运算符和指令
checked表示对包含在类的类型转换表达式进行检查,如果溢出就抛出异常;uncheck表示对包含在类的类型转换表达式不进行检查。
3. 引用转换(对象之间的转换,区别于纯数字的转换)
1)隐式引用转换(意思是不需要转换)
类型可以隐式转换为它继承链上的,任何类型和接口。
2)显式引用转换
安全的显示引用转换,有以下2种:
(1)往继承链上转换;
(2)null转换,如下图:
4. 装箱转换与拆箱转换
1)装箱转换
装箱转换是将值类型转换为引用类型,是隐式转换。装箱操作和其他转换一样,并也没有对转换的内容进行处理,而是创建了一个“副本”,如下图变量i并没有变,而是创建了一个object副本,赋值给oi。
2)拆箱转换
拆箱转换是将引用类型转换为值类型,需显示转换。
3)尽量避免装箱和拆箱
我们之所以研究装箱和拆箱,是因为装箱和拆箱会造成相当大的性能损耗(相比之下,装箱要比拆箱性能损耗大),性能问题主要体现在执行速度和字段复制上。因此我们在编写代码时要尽量避免装箱和拆箱,常用的手段为:
(1)使用重载方法。为了避免装箱,很多FCL中的方法都提供了很多重载的方法。比如我们之前讨论过的Console.WriteLine方法,提供了多达19个重载方法,目的就是为了减少值类型装箱的次数。比如看下面的这段代码:
Console.WriteLine(3);
刚开始你可能觉的3会装箱为string类型,但是实际上这条语句不会进行装箱操作,是因为Console.WriteLine方法有一个重载的方法,参数就是一个int的值。
public static void WriteLine(int value);
(2)使用泛型。因为装箱和拆箱的性能问题,所以在.NET 2.0中引用了泛型,他的主要目的就是避免值类型和引用类型之间的装箱和拆箱。我们常用的集合类都有泛型的版本,比如ArrayList对应着泛型的 List<T>,Hashtable对应着Dictionary<TKey, Tvalue>。
(3)tostring方法不是装箱操作。
5. 用户自定义转换