当前位置: 移动技术网 > IT编程>开发语言>c# > C#中关于值类型和引用类型的区别

C#中关于值类型和引用类型的区别

2019年12月03日  | 移动技术网IT编程  | 我要评论
小声哔哔 一直以来对于值类型与引用类型之间的区别都不是特别清晰,直到踩了坑.... 正好最新闲暇,便想着梳理梳理这一两年来遇到的奇葩问题和解决方案,顺便就把它给拎出来记一下,免得以后再摔跤 值类型与引用类型的区别 今天为了说明值类型与引用类型的典型区别,准备把结构体(值类型)和类(引用类型)拉出来溜 ...

小声哔哔

一直以来对于值类型与引用类型之间的区别都不是特别清晰,直到踩了坑....
正好最新闲暇,便想着梳理梳理这一两年来遇到的奇葩问题和解决方案,顺便就把它给拎出来记一下,免得以后再摔跤

值类型与引用类型的区别

今天为了说明值类型与引用类型的典型区别,准备把结构体(值类型)和类(引用类型)拉出来溜溜

首先咱们先定义一下

    /// <summary>
    /// 类
    /// </summary>
    class testclass
    {
        public int id { get; set; }
        public string name { get; set; }
    }

    /// <summary>
    /// 结构体
    /// </summary>
    struct teststruct
    {
        public int id { get; set; }
        public string name { get; set; }
    }

然后咱看代码

    class program
    {
        static void main(string[] args)
        {
            //测试引用类型
            testclass c1 = new testclass { id = 0, name = "未定义" };
            testclass c2 = c1;//c1给了c2
            c2.id = 1;c2.name = "a";
            console.writeline($"c1[{c1.id},{c1.name}]");
            //测试值类型
            teststruct s1 = new teststruct { id = 0, name = "未定义" };
            teststruct s2 = s1;//s1给了s2
            s2.id = 2; s2.name = "b";
            console.writeline($"s1[{s1.id},{s1.name}]");
            console.readkey();
        }
    }

最后看结果

结束

好了,结果显而易见。
c1和s1我一直没有动过它,s1(值类型)倒是乖乖的,但是c1(引用类型)却跟着c2变了,由此我们可以想到

值类型的每一次赋值都会执行一次逐字段的复制,引用类型的赋值只是指针的传递,其实也是生成新的指针实例。

也就是说,咱们在c1和c2之间进行值传递的时候,传的其实只是内存地址而已。就像你有一张银行卡,你用它绑了支付宝又用它绑了微信,无论你用哪个app去买包子,花的都是你银行卡里的钱
最后,遇到这个坑别忘了跳一跳,摔到里面真的挺疼的

相关代码地址(github)

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网