• 浅学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语法的特性,判断返回结果的方式。

  • 相关阅读:
    快速入门各种跨域
    常用知识点
    比较少用的格式
    git
    “没有用var声明的为全局变量”这种说法不准确
    类数组对象
    函数上下文的变量对象实例
    var a =10 与 a = 10的区别
    原型链与作用域链、执行上下文
    闭包的作用
  • 原文地址:https://www.cnblogs.com/bu-dong/p/11361912.html
Copyright © 2020-2023  润新知