似曾相识?值类型与引用类型的区别及其转换
作者:网络转载 发布时间:[ 2013/1/24 11:39:55 ] 推荐标签:
值类型与引用类型的区别
在上一篇中,简单的总结了下值类型与引用类型的基本概念。下图是总结的一张表
关于内存的分配问题,这些堆和栈的概念,我都是不是很懂。类似一个篮子,里面可以放各式各样的东西。这里是用来放置不同类型的数据,先大致这样来理解下。以后要用到的时候再去研究,如果有兴趣大家看看这个堆栈或许能明白。
主要区别
值类型的变量包含自身的数据,而引用的数据类型包含指向数据的内存块引用。读到这里,让我想起了VB时代里,byref和byval。这两种不同的传值方式。接着来说值类型和引用类型,值类型对于每个变量都有一份自己的数据拷贝,则在使用数据的时候,不会因为对一个数据的操作去影响另一个数据;而在引用类型中,可以通过对一个变量的操作来影响另一个变量的引用的对象。
来看一个例子,或许更生动点
namespace _1
{
class ValueClass //定义类
{
public int value = 0;
}
class ValueAndRefType //定义类
{
public static void Main() //方法
{
int a = 0; //a的初始变量未整型0
int b = a;
b = 10;
ValueClass ref1 = new ValueClass(); //创建类对象ref1
ValueClass ref2 = ref1; //创建类对象ref2,并赋值ref1
ref2.value = 10;
Console.WriteLine("Value:{0},{1}", a, b); //对变量ref2重新赋值
Console.WriteLine("Refs:{0},{1}", ref1.value, ref2.value); //通过ref2重新赋值,影响了ref1和ref2所引用对象
}
}
}
运行结果:
Value:0,1
Refs:10,10
在这里例子中,大家看到对局部变量a、b初始化后,b重新赋值并没有影响a的值。a仍然是0.而当我们将ref2的值赋上10后,则影响了ref1和ref2所引用的对象,也影响了ref1的值。也出现了refs:10,10.
装箱和拆箱
装箱是将值类型转换为引用类型,反之是将引用类型转换为值类型。类似于VB中的转换函数。
装箱操作
将值类型转换为object类型,是一个数值分配给一个对象实例,并将这个数值拷贝到新对象中。
int num =2012;
object obj =num;
如上,创建一个整数类型的变量num后。第二行中,将其拷贝到obj的引用类型中。上述的语句是在堆栈种创建一个对象obj,而该对象引用了堆栈上的int类型数值。
拆箱操作
也即是将obj类型转换为值类型。
int num=2012;
object obj=num;
int num1=(int)obj;
比较着两段代码,大家可以看到。在拆箱过程中,仅仅多了后一个强制转换。这是为什么呢?哦,这是因为在拆箱情况下,一个对象可以强制转换到任何类型。因此必须使用强制转换。
综上,无论是值类型与引用类型的区别还是转换。大家都可以从VB的知识中,找到相关的影子。在接下来的学习中,应该会有很多的知识都是可以联系到我们的VB知识的。有种似曾相似,原来是你!
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11