您的位置:首页 > 编程语言 > C#

装箱与拆箱

2015-12-31 13:12 218 查看
总结来说:装箱就是将值类型转化成引用类型,拆箱就是就是将引用类型转化成值类型

装箱:
int n = 10;
string s = n.ToString();//这个不是装箱。string与int是完全不同的两种类型,没有父子类关系,所以不可能发生装箱和拆箱,
因为本身就不具备类型直接转换的功能。
Console.WriteLine(s);
int n = 10;
//n是int类型,int就是Int32,而Int32是一个结构继承字System.ValueType而该类又继承自Object,所以int类型与object类型具有子父类关系,所以可以发生类型
object o = n;//这里发生了一次装箱。
Console.WriteLine(o);

            Person p = new Person();
            object o = p;      //都是引用类型,所以没有装箱。
            Console.WriteLine(o);

int n = 10, m = 100;
string s1 = "58";
string s2 = "200";

string s = n + m + s1 + s2; //只发生了一次装箱,先把n与m相加,然后再与字符串拼接,调用Concat()方法,转换成object类型。

//string s = n + s1 + m + s2;//这里发生了两次装箱
int r = int.Parse(s);
Console.WriteLine(r);//如果遇到函数重载有对应的类型则也不发生装箱。
//Console.WriteLine("最后结果是:{0}", r);// 这里调用了object参数的重载所以这里也装箱了

拆箱:

double d = 90;
object o = d; //装箱
int n = (int)o;//拆箱,但是拆箱有问题,装箱的时候使用的什么数据类型,拆箱的时候必须还是使用对应的数据类型拆箱。


装箱与拆箱的效率问题:

ArrayList arraylist = new ArrayList();
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < 10000000; i++)
{
arraylist.Add(i);
}
watch.Stop();
Console.WriteLine(watch.ElapsedMilliseconds);
Console.ReadKey();执行结果为:
........................................................................

1339 毫秒

下面没有装箱:

List<int> list = new List<int>();
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < 10000000; i++)
{
list.Add(i);
}
watch.Stop();
Console.WriteLine(watch.ElapsedMilliseconds);
Console.ReadLine();执行结果为:
........................................................................

162毫秒

由以上可知装箱,拆箱是十分影响性能的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c#