可以使用以下运算符来执行类型检查或类型转换:
is 运算符:用于检查表达式的运行时类型是否与给定类型兼容
as 运算符:用于将表达式显式转换为给定类型(如果其运行时类型与该类型兼容)
强制转换运算符 ():用于执行显式转换
typeof 运算符:用于获取某个类型的 System.Type 实例
is转换规则: 1. 检查对象类型的兼容性,并返回结果true(false); 2.不会抛出异常; 3.如果对象为null,刚返回false; 示例:
object o = "abc"; if (o is string) //执行第一次类型兼容性检查
{
string s = (string)o; //执行第二次类型兼容性检查,并转换
MessageBox.Show("转换成功!");
}
else {
MessageBox.Show("转换失败!");
}
as转换规则: 1.检查对象类型的兼容性,并返回转换结果,如果不兼容则返回null; 2.不会抛出异常; 3.如果结果判断为空,则强制执行类型转换将抛出NullReferenceException异常; 示例:
object o = "abc"; string s = o as string; //执行第一次类型兼容性检查,并返回结果
if (s != null)
MessageBox.Show("转换成功!");
else
MessageBox.Show("转换失败!");
注:as比is少执行一次兼容性检查,性能可能会高一点点。
装箱是将值类型转换为object类型或由此值类型实现的任何接口类型的过程。当CLR对值类型进行装箱时,会将该值包装到System.Object内部,再将后者存储在托管堆上。取消装箱将从对象中提取值类型。
装箱是隐式的;取消装箱是显示的。
装箱和取消装箱的概念是类型系统C#统一视图的基础,其中任一类型的值都被视为一个对象。
装箱性能相关(以Unity中Debug.Log(object)函数为例)
考虑一种基本的装箱情况,当使用Debug.Log(object)函数时,函数的参数类型为object,也就意味着任何类型的变量都能传递给这个函数。例如当我们传递一个整数的时候,编译器将会对传递进来的整数进行装箱操作使其变成object类型,而我们知道装箱操作是需要耗费一点时间的,那么我们可以通过预见装箱操作来对其做一定的优化工作。