类型转换

类型转换

类型转换分为显式转换和隐式转换, 显示转换是我们必须明确地告知编译器, 要把变量从源类型转换成什么类型, 而隐式的则不需要, 编译器会自动帮我们进行转换.

隐式类型转换

当编译器认为从类型1到类型2的转换不会产生不良后果, 编译器会自动完成转换. 基中”不良后果”指“数据截断, 精度损失”。
哪些情况不产生”不良后果”?
数值类型的隐式转换:从窄向宽的转换
引用类型的隐式转换:从派生类到基类, null类型到所有引用类型

显示类型转换

由宽向窄的转换需要显示转换

int intValue = (int)longValue;

溢出检查(checked, unchecked)

强制转换时(byte)myInt, 这种形式是默认不进行溢出检查的, 等同于unchecked((byte)myInt)

若想要启用溢出检查, 使用checked((byte)myInt), 若检查出有溢出情况, 会抛System.OverflowException

引用类型转换时, 转换的是栈中的类型, 而堆中的对象类型和数据都不受影响

装箱与拆箱

从值类型到引用类型的转换称为装箱, 从引用类型到值类型的转换称为拆箱

装箱: 1. 值类型可隐式转换到object类型或System.ValueType类型 2. 非Nullable值类型可隐式转换到它实现的接口 3. 枚举类型可隐式转换到 System.Enum类型

拆箱: 1. 从object类型或System.ValueType到值类型转换 2. 从接口类型到值类型(实现了该接口)的转换 3. 从System.Enum类型到枚举类型的转换

as和is

如果测试对象的目的是确定它是否属于所需类型,并且如果测试结果为真,就要立即进行转换,这种情况下使用as操作符的效率更高; 但有时仅仅只是测试,并不想立即转换, 只是在对象实现了接口时, 要将它加到一个列表中, 这时is操作符就是一种更好的选择

object c2 = c1;
if(c2 is Class1)
{
    // do something
}
Class1 c = c2 as Class1;
if(c != null)
{
    // do something
}
原文地址:https://www.cnblogs.com/home-wang/p/10943132.html