有时候,我们不想用值类型的值,就是想用一个引用。.Net提供了一个名为装箱(boxing)的机制,它允许根据值类型来创建一个对象,然后使用对这个新对象的一个引用。

首先,回顾两个重要的事实,1.对于引用 类型的变量,它的值永远是一个引用;2.对于值类型的变量,它的值永远是该值类型的一个值。

 int i = 5;object o = i;int j = (int)o;

这里有两个变量:i是值类型的变量,o是引用类型的变量。将i的值赋给o有道理吗?o的值必须是一个引用,而数字5不是一个引用,它使用整数值。实际发生的事情就是装箱:运行时将在堆上创建一个包含值(5)的对象,o的值是对该新对象的一个引用。该对象的值是原始值的一个副本,改变i的值不会改变箱内的值。

第3行执行相反的操作——拆箱。必须告诉编译器将object拆箱成什么类型。如果使用了错误的类型(比如o原先被装箱成unit或者long,或者根本就不是一个已装箱的值),就会抛出一个InvalidCastException异常。同样,拆箱也会复制箱内的值,在赋值之后,j和该对象之间不再有任何关系。

剩下的唯一问题就是要知道装箱和拆箱在什么时候发生。拆箱一般很明细的,因为要在代码中明确地显示一个强制类型转换。装箱则可能在没有意识的时候发生。如上面代码的第二行。但是,为了一个类型的值调用ToString,Equals或GetHashCode方法时,如果该类型没有覆盖这些方法,也会发生装箱。(同时,当你调用类型变量值的GetType()方法时,也会伴随着装箱的过程。如果处理为装箱形式的变量,你应该已经知道了具体类型,因此使用typeof替代即可。)别外,将值作为接口表达式使用时——把它赋值给一个接口类型的变量,或者把它作为接口类型的参数来传递——也会发生装箱。例如,Icomparable x = 5;语句会对5进行装箱。

之所以要留意装箱和拆箱,是由于它们可能会降低性能。同样这种性能损失通常不是大问题,但是还是应该值得注意。

针对typeof,getType is as 的一些代码

 public class Animal { }public class Dog : Animal { }
 /// <summary>/// typeof takes a type name(which yoy specify at compile time)/// GetType gets the runtime type of an instance/// is returns true if an instance is in the inheritance tree/// </summary>public void TestTypeOfAndGetType(){var dog = new Dog();var result = dog.GetType() == typeof(Animal);var result1 = dog is Animal;var result2 = dog.GetType() == typeof(Dog);Console.WriteLine("dog.GetType() == typeof(Animal) :{0}",result);Console.WriteLine("dog is Animal :{0}", result);Console.WriteLine("dog.GetType() == typeof(Dog):{0}", result);}
别外,关于as的,as运算符类似于强制转换类型操作,但是,因此,如果转换是不可能的,as返回null而不引发异常。下面两句代码是等效的:
expression as type
expression is type ? (type)expression : (type)null
下面是MSDN中的一个DEMO:
class ClassA { }
class ClassB { }class MainClass
{static void Main(){object[] objArray = new object[6];objArray[0] = new ClassA();objArray[1] = new ClassB();objArray[2] = "hello";objArray[3] = 123;objArray[4] = 123.4;objArray[5] = null;for (int i = 0; i < objArray.Length; ++i){string s = objArray[i] as string;Console.Write("{0}:", i);if (s != null){Console.WriteLine("'" + s + "'");}else{Console.WriteLine("not a string");}}}
}
/*
Output:
0:not a string
1:not a string
2:'hello'
3:not a string
4:not a string
5:not a string
*/

转载于:https://www.cnblogs.com/RealAlex/p/3475240.html

C# typeof Gettype is as 拆箱 装箱相关推荐

  1. java char的包装对象,Java 从Character和char的区别来学习自动拆箱装箱

    本文结构 1.Character和char 的区别: 2.自动拆箱装箱java 1.Character和char 的区别: Character是类,char基本数据类型.数组 在java中有三个类负责 ...

  2. 【JAVA基础篇】彻底搞懂拆箱装箱

    什么是装箱拆箱? Java有8种基本数据类型,并且为这8种类型提供了包装器类型.比如说int类型的包装器类型是Integer. 装箱是指将基本数据类型转换成对应的包装器类型.拆箱是指将包装器类型转换基 ...

  3. JAVA高级特性--自动拆箱-装箱,枚举类型

    基本数据类型转换为引用类型对象 一个自动装箱的例子 Integer i=10;相当于 Integer i=new Integer(10); 一个自动拆箱的例子 Integer m=10;int n=m ...

  4. JDK 1.5 新特性——自动拆箱装箱

    1.5版本支持了自动包装和解包操作,对于bool/Boolean,byte/Byte,double/Double,short/Short,int/Integer, long/Long,float/Fl ...

  5. 拆箱装箱有什么作用JAVA_基础--最简单明了的拆箱装箱解释,带实例

    前言 在JAVA中,拆箱和装箱操作是发生在基本数据类型和其包装类之间的一种操作. JAVA中的八种基本类型有:byte short int long float double boolean char ...

  6. Java中的自动拆箱装箱(AutoboxingUnboxing)

    一.基本类型打包器 1.基本类型:long.int.double.float.boolean 2.类类型:Long.Integer.Double.Float.Boolean 区别:基本类型效率更高,类 ...

  7. 包装类的作用、拆箱/装箱实例演示和详细剖析

    Ⅰ.如果你看懂了我写的文章,并实践成功,麻烦评论一个笑脸,如果实践未成功,麻烦评论其他表情,或者问题出处,以便我改正,谢谢各位大佬和朋友! Ⅱ.您的评论是我继续写下去的动力!!! Ⅲ.我所使用的工具为 ...

  8. 程序员认知(一)数据、变量、数据类型、内存、表达式、指针、算法、数据结构、拆箱装箱

    目录: 数据 变量 数据类型 变量.对象与内存 赋值运算符 指针 算法 数据结构 第一个认知:数据 从<C#入门经典>(第8版)中引用一句话: 计算机程序最基本的描述也许是"一系 ...

  9. 包装类:valueOf方法、intValue方法、自动拆箱装箱

    包装类 包装类是为了解决基本类型不能在直接参与面向对象开发的问题 8个基本类型对应8个不同的包装类,其中6个表示数字的包装类继承自java.lang.Number,其他两个继承自Object 包装类是 ...

最新文章

  1. android GridView item中组件获取焦点
  2. 社区资源 | NeurIPS 2020预讲会回放资料(含PPT)
  3. TYVJ 1557 MST+LCA
  4. 自动替换 Kubernetes 镜像
  5. We7 CMS 2.7beta3 版发布!SVN源码同步开放
  6. Python使用Apriori算法查找关系密切的演员组合
  7. 编程语言_Java方法参数...是什么意思_面试题008
  8. 书单|互联网企业面试案头书之数据分析师篇
  9. 云原生生态周报 Vol. 3 | Java 8 ❤️ Docker
  10. 【连载】第三章刚体的定轴转动第二节转动惯量 刚体定轴转动定律
  11. 从苏宁电器到卡巴斯基第05篇:我的创业梦
  12. 163邮箱的登陆页面是什么样的有几种登陆方式?163邮箱手机版登陆
  13. Python批量删除docx文档中所有页眉和页脚
  14. Mob 秒验 实测评
  15. 电感耦合等离子体光源(ICP)
  16. Alarm机制-学习记录
  17. Vue面试题你知道多少
  18. mysql不包含模糊查询
  19. Suggestions of 周爱民
  20. 使用Wordpress搭建个人博客网站

热门文章

  1. 中国首款L4级Robovan发布!文远知行商用落地两条腿走路
  2. 英特尔用英伟达显卡,给GTA5打了个超强画质补丁
  3. 华为云中文预训练模型发布:全球最大、千亿参数,逼近人类神经元
  4. AI时代的GitHub,这个陆奇看好的方向,终于有人做了
  5. 3D打印火箭发动机真被做出来了!首次地面全周期点火实测,发射报价不到猎鹰9的五分之一...
  6. oracle导入sql文件
  7. 重定向、管道和用户管理练习题
  8. 转VS2010解决方案转换到VS2008
  9. 《多处理器编程的艺术》读书笔记(4)--- 自旋锁(1)
  10. Tech Ed上Windows 7值得关注的课程