C# 强制类型转换和as区别和不同使用场景

文章目录

在C#中,as 和 强制类型转换(例如 (T)value)的主要区别在于它们处理类型转换不成功时的行为和适用场景:

1.强制类型转换

  • 使用语法:Type variable = (Type)expression;
  • 当你确定 expression 的运行时类型可以安全地转换为目标类型 Type 时,使用强制类型转换。
  • 如果转换不可行(比如转换的对象实际上不是目标类型或其派生类型),将会抛出 System.InvalidCastException 异常。
  • 对于值类型之间的转换,如果该转换是预定义的(如内置数值类型的扩大或缩小转换),编译器会确保转换合法,否则同样会导致编译错误或运行时异常。

2. as 运算符

  • 使用语法:Type variable = expression as Type;
  • 当你想尝试将一个对象转换为目标类型但不想因为转换失败而抛出异常时,可以使用 as 运算符。
  • 如果转换成功,variable 将被赋值为转换后的新类型实例;如果转换失败,则 variable 将被赋值为 null(对于引用类型)。
  • 注意,由于值类型不能为 null,所以 as 运算符不能用于从非 null 值类型到其他值类型的转换。

3.实例

  1. 强制类型转换实例:
csharp 复制代码
object obj = "Hello, World!";
string str = (string)obj; // 此处的强制类型转换是安全的,因为 obj 实际上是一个字符串。

// 或者对于值类型的转换:
int value = 123;
double dblValue = (double)value; // 这是一个合法的数值类型转换。
  1. as 运算符实例:
csharp 复制代码
class Animal { }
class Dog : Animal { }

Animal myAnimal = new Dog();
Dog myDog = myAnimal as Dog; // 此处转换成功,myDog 现在引用了 Dog 类型的对象。

// 如果尝试转换一个实际上是 Animal 类型的对象:
Animal notADog = new Animal();
Dog failedDog = notADog as Dog; // 此处转换失败,failedDog 将被赋值为 null。

// 对于值类型,以下代码无法编译,因为 int 是非 null 值类型:
// int? nullableInt = 123;
// object obj = nullableInt.Value;
// int backToInt = obj as int; // 编译错误,as 不适用于从对象到非 null 值类型的转换。

在这两个例子中,如果使用强制类型转换并且转换不成功,程序会抛出异常。而在使用 as 运算符时,如果转换不成功,则变量会被赋值为 null(对于引用类型)。

总结:

强制转换适合你知道转换一定能成功的情况,并且愿意承担转换失败时引发异常的风险。

  • as 运算符提供了一种更安全、非破坏性的转换方式,尤其在处理可能为 null 的引用类型时。但它不会执行用户自定义的转换操作,仅限于参考类型间的隐式转换或者引用类型到接口的转换。

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)


​最后我们放松一下眼睛

相关推荐
工业3D_大熊3 分钟前
3D可视化引擎HOOPS Luminate场景图详解:形状的创建、销毁与管理
java·c++·3d·docker·c#·制造·数据可视化
szc17676 分钟前
docker 相关命令
java·docker·jenkins
程序媛-徐师姐16 分钟前
Java 基于SpringBoot+vue框架的老年医疗保健网站
java·vue.js·spring boot·老年医疗保健·老年 医疗保健
yngsqq17 分钟前
c#使用高版本8.0步骤
java·前端·c#
尘浮生26 分钟前
Java项目实战II基于微信小程序的校运会管理系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
偶尔。53528 分钟前
什么是事务?事务有哪些特性?
数据库·oracle
安迁岚30 分钟前
【SQL Server】华中农业大学空间数据库实验报告 实验六 视图
数据库·sql·mysql·oracle·实验报告
小白不太白95031 分钟前
设计模式之 模板方法模式
java·设计模式·模板方法模式
Tech Synapse33 分钟前
Java根据前端返回的字段名进行查询数据的方法
java·开发语言·后端