浅学CLR via C#笔记之类型转换
我们都知道CLR最重要的一个特性就是类型安全,它在运行时就知道对象类型。
但我们会经常用到将一种类型转换成另一种类型,CLR也允许将对象转成他的实际类型,或者是它的基类型。
在C#中,支持隐士转换成它的基类型。
类型转换会用到以下方式:
1 public class EntityBase 2 { 3 public int Id {get; set;} 4 } 5 public class User 6 { 7 public string Name {get; set;} 8 } 9 10 ..... 11 public static void Main() 12 { 13 var user = new User(); 14 var entity = user; // 隐士转换 15 Object obj = user; 16 var user2 = (User) obj; // 显示转换 17 var user3 = obj as User; // as操作符转换 18 }
其中 (User) obj 用了强制转换,如果原始类型不是User的时候,会抛出异常。
而obj as User 会先判断类型,然后才会转换,如果原始类型不是User的时候,会返回null,反而不会抛出异常。
有的时候为了处理异常,需要加一些判断,比如使用如下判断语句,先判断类型是否正确:
1 if(obj is User){ 2 var user2 = (User) obj; 3 // or 4 var user3 = obj as User; 5 }
这样也可以实现,但是我们可以换另外一种给方式去写,会更简单。
因为对obj as User而言 会先判断类型,然后才会转换,那这样的话就会跟外层的is语句有重复判断的部分,在单条语句不会引起很大的性能方面的损耗,但是如果在一个比较大的循环语句中这样大量的重复判断,性能损耗将是一个很大的影响。
1 var user3 = obj as User; 2 if(user3 is null) 3 { 4 // .... 5 }
如上写法,依据as语法的特性,判断返回结果的方式。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库