欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

值类型、引用类型、拆箱装箱

程序员文章站 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);
这个也是拆箱,不解释了。反正就是值类型编程引用类型的就叫装箱,反正叫拆箱