马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

浅学CLR via C#笔记之类型转换

[复制链接]
查看2598 | 回复0 | 2019-8-16 10:53:20 | 显示全部楼层 |阅读模式

我们都知道CLR最重要的一个特性就是类型安全,它在运行时就知道对象类型。

但我们会经常用到将一种类型转换成另一种类型,CLR也允许将对象转成他的实际类型,或者是它的基类型。

在C#中,支持隐士转换成它的基类型。

类型转换会用到以下方式:

  1. 1 public class EntityBase
  2. 2 {
  3. 3 public int Id {get; set;}
  4. 4 }
  5. 5 public class User
  6. 6 {
  7. 7 public string Name {get; set;}
  8. 8 }
  9. 9
  10. 10 .....
  11. 11 public static void Main()
  12. 12 {
  13. 13 var user = new User();
  14. 14 var entity = user; // 隐士转换
  15. 15 Object obj = user;
  16. 16 var user2 = (User) obj; // 显示转换
  17. 17 var user3 = obj as User; // as操作符转换
  18. 18 }
复制代码

其中 (User) obj 用了强制转换,如果原始类型不是User的时候,会抛出异常。

obj as User 会先判断类型,然后才会转换,如果原始类型不是User的时候,会返回null,反而不会抛出异常。

有的时候为了处理异常,需要加一些判断,比如使用如下判断语句,先判断类型是否正确:

  1. 1 if(obj is User){
  2. 2 var user2 = (User) obj;
  3. 3 // or
  4. 4 var user3 = obj as User;
  5. 5 }
复制代码

这样也可以实现,但是我们可以换另外一种给方式去写,会更简单。

因为对obj as User而言 会先判断类型,然后才会转换,那这样的话就会跟外层的is语句有重复判断的部分,在单条语句不会引起很大的性能方面的损耗,但是如果在一个比较大的循环语句中这样大量的重复判断,性能损耗将是一个很大的影响。

  1. 1 var user3 = obj as User;
  2. 2 if(user3 is null)
  3. 3 {
  4. 4 // ....
  5. 5 }
复制代码

如上写法,依据as语法的特性,判断返回结果的方式。





来源:https://www.cnblogs.com/bu-dong/p/11361912.html
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则