有时候,我们不想用值类型的值,就是想用一个引用。.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
*/

C# typeof Gettype is as &拆箱 装箱的更多相关文章

  1. WPF中多线程统计拆箱装箱和泛型的运行效率

    WPF中多线程统计拆箱装箱和泛型的执行效率.使用的知识点有泛型.多线程.托付.从样例中能够看到使用泛型的效率至少提升2倍 MainWindow.xaml <Window x:Class=&quo ...

  2. Java 从Character和char的区别来学习自动拆箱装箱

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

  3. Java中的自动拆箱装箱(Autoboxing&Unboxing)

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

  4. int和Integer的自动拆箱/装箱相关问题

    java中为没一种基本类型都提供相应的包装类型. byte,short,char,int,long,float,double和boolean Byte,Short,Character,Integer, ...

  5. Java包装类及其拆箱装箱

    Java包装类,Wrapper~由于在java中,数据类型总共可分为两大种,基本数据类型(值类型)和类类型(引用数据类型).基本类型的数据不是对象,所以对于要将数据类型作为对象来使用的情况,java提 ...

  6. [C#学习笔记]你真的理解拆箱装箱吗?

    学习一项新知识的时候,最好的方法就是去实践它. 前言 <CLR via C#>这本神书真的是太有意思了!没错我的前言就是这个. 装箱 首先来看下,下面这段代码 可以看到,每次循环迭代都会初 ...

  7. JavaWeb_静态导入、自动拆箱/装箱

    静态导入用于简化程序对类静态属性和方法的调用. 语法 import static 包名.类名.静态属性|静态方法|* 例如 import static java.lang.System.out imp ...

  8. 第六篇 .NET高级技术之拆箱装箱

    拆箱.装箱 值类型赋值给Object类型变量的时候,会发生装箱:包装成Object.ValueType不也是继承自Object吗(CLR内部处理): Object类型变量赋值给值类型赋值的时候会发生拆 ...

  9. java 对象 拆箱装箱 编译和反编译的验证

    创建对象 package 创建对象的个数; public class main { public static void main(String[] agrs){ Check c1=new Check ...

随机推荐

  1. C/C++中unsigned char和char的区别

    代码: #include <cstdio> #include <iostream> using namespace std; int main(){ unsigned char ...

  2. console调试--转

    目录: 一.什么是 Console 二 .什么浏览器支持 Console 三.为什么不直接使用 alert 或自己写的 log 四.console.log(object[,object,.....]) ...

  3. 大小写转换,split分割

    一.大小写转换 1.定义和用法 toUpperCase() 方法用于把字符串转换为大写. toLowerCase() 方法用于把字符串转换为小写.    用法: stringObject.toUppe ...

  4. 详解ios文件系统文件目录读写操作-备用

    iPhone文件读写系统操作教程是本文要介绍的内容,对于一个运行在iPhone得app,它只能访问自己根目录下得一些文件(所谓sandbox).一个app发布到iPhone上后,它得目录结构如下:  ...

  5. 转:堆(heap)和栈(stack)有什么区别??

    简单的可以理解为: heap:是由malloc之类函数分配的空间所在地.地址是由低向高增长的. stack:是自动分配变量,以及函数调用的时候所使用的一些空间.地址是由高向低减少的. 预备知识—程序的 ...

  6. 转:ASCII码表_全_完整版

    ASCII码表 ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 0 NUL 32 (space) 64 @ 96 . 1 SOH 33 ! 65 A 9 ...

  7. android更新SDK时候丢失annotations.jar 导致支持库报错

    I am trying to update my Android SDK Tools to 17 rev. and I updated usign SDK Tools but in Propertie ...

  8. clone database and rename

    使用 management studio right click database -> Tasks -> Generate Scripts -> next until " ...

  9. http状态码有那些?分别代表是什么意思

    http状态码有那些?分别代表是什么意思? 简单版 [ 100 Continue 继续,一般在发送post请求时,已发送了http header之后服务端将返回此信息,表示确认,之后发送具体参数信息 ...

  10. Yii 引入 js和css

    //向控制器指定的页面注册新的css文件 Yii::app()->clientScript->registerCssFile(Yii::app()->baseUrl.'/css/my ...