值类型、引用类型、拆箱装箱
程序员文章站
2022-05-06 09:33:38
...
值类型和引用类型:
不多说先上代码
我们先建一个控制台应用程序 代码如下:
namespace test
{
public class Program
{
static void Main(string[] args)
{
testFun();
}
public static void testFun()
{
int i = 0;
var j = i;
TestClass tClass = new TestClass();
TestClass t2 = tClass;
i = 1;
t2.num = 1;
Console.WriteLine("i={0},j={1},tClassNum={2},t2Num={3}", i, j, tClass.num, t2.num);
}
}
public class TestClass
{
public TestClass()
{
this.num = 0;
}
public int num { get; set; }
}
}
直接运行后结果如图
在程序中,我们改变了i的值 j却保持不变,而我们改变了 tClass的值,t2却变了。前者称为值类型,后者成为引用类型,它引用的是TestClass的地址,所以当我们改变值类型的时候,另一个不会发生改变,当我们改变引用类型的时候,另一个会受到影响。换种说法就是:
值类型:我有三万块,你也有三万块,我赚了两万块之后,我有五万块而你却还是三万块。
引用类型:我把3万块存进银行,银行给了我们2张卡,一人一张,共用这3万块。当我赚了2万块存进银行里面,我的卡显示余额是五万,你的卡显示也是五万。
那么哪些是引用类型哪些是值类型呢?
object跟String是引用类型 其他都是值类型,具体可以用object.ReferenceEquals(val1,val2)来进行判定
例如:
int i=0;
int j=0;
那么object.ReferenceEquals(i,j)返回的是false;
string i="a";
string j="a";
那么object.ReferenceEquals(i,j)返回的是true;
这里如果返回true就说明是引用类型,反正是值类型;
具体可以自己去试试。
拆箱与装箱
如果由值类型转成是引用类型就叫做装箱,反之则称为拆箱。举个栗子,例如我把钱放到银行里变成了银行卡,就叫做装箱,类似于装到箱子里面,如果把银行卡里面的钱全部拿出来就叫做拆箱。这个应该比较好理解吧
再用代码来举个栗子:
int i=0;
string j=i.ToString();
这个是装箱,int是值类型,string是引用类型
int i=0;
object j=i;
这个也是装箱
string j="0";
int i=int.Parse(j);
这个是拆箱
object j=0;
int i=int.Parse(j);
这个也是拆箱,不解释了。反正就是值类型编程引用类型的就叫装箱,反正叫拆箱