文章目录
1、括号强制类型转换
2、as运算符
3、实例
在C#中,as和强制类型转换(如:(T)Value)的主要区别在于它们处理类型转换不成功时的行为和应用场景
1.括号强制类型转换
使用语法:Type variable = (Type)Expression;
当你确定Expression运行时可以安全的转换为目标Type类型时,使用强制类型转换;
如果转换不可行(如转换的对象实际上不是目标类型或其派生类型),将会抛出System.InvildCastException异常
对于值类型之间的转换,如果该转换是预定义的(如内置数值类型的扩大或缩小转换),编译器会确保转换合法,否则同样会导致编译错误或运行时异常
- as运算符
使用语法:Type variable = Expression as Type;
当你想尝试将一个对象转换为目标类型但不想因为转换失败抛出异常时,可以使用as运算符;
如果转换成功,variable将会被转换为目标类型的实例;如果转换失败,variable将会被赋值为null(对于引用类型)
注意,对于值类型,不能为null;所以as运算符不能用于从非null值类型到其他值类型的转换
- 实例
强制类型转换实例
点击查看代码
object obj = "Hello world!"; string str = (string)obj;//此处强制类型转换是安全的,因为ojg实际上就是一个字符串//或者对于值类型的转换
int value = 32;
double dValue = (double)value;//这是一个合法的数值类型转换
as运算符实例
点击查看代码
class Animal {}
Class Dog:Animal
{
}
Animal myAnimal = new Dog();
Dog myDog = myAnimal as Dog; //此处转换成功,因为myDog引用了Dog的类型的对象
//如果尝试转换一个实际上是Animal类型的对象
Animal notDog = new Animal();
Dog failedDog = notDog as Dog;//此处转换失败,failedDog 将会被赋值为 null
//对于值类型,以下代码无法编译,因为int 是非null 值类型
//int? nullableInt = 123;
//object obj = nullableInt.Value;
//Int backToInt = obj as int; //编译错误,as运算符 不适用于从对象到非 null 值类型的转换
在这两个例子中,如果使用强制类型转换并且转换不成功,程序会抛出异常。而在使用as运算符时,如果转换不成功,变量会被赋值为 null(对于引用类型)。
总结:
1.强制类型转换适用于你知道类型转换一定成功的情况下,并且愿意承担转换失败时候抛出的异常风险
2.as运算符类型转换,提供了一种更安全、非破环性的转换方式,尤其在处理可能为null的引用类型时。但它不会执行用户自定义的转换操作,仅限于参考类型之间的隐式转换或者引用类型到接口之间的转换