一直以来关于值类型与引证类型之间的差异都不是特别清晰,直到踩了坑….
正好最新空闲,便想着整理整理这一两年来遇到的奇葩问题和解决方案,趁便就把它给拎出来记一下,免得以后再摔跤
值类型与引证类型的差异
今日为了阐明值类型与引证类型的典型差异,预备把结构体(值类型)和类(引证类型)拉出来溜溜
首要我们先界说一下
//////类///classTestClass{publicintId{get;set;}publicstringName{get;set;}
}//////结构体///structTestStruct
{publicintId{get;set;}publicstringName{get;set;}
}
然后咱看代码
classProgram{staticvoidMain(string[]args){//测验引证类型TestClassc1=newTestClass{Id=0,Name=”未界说”};
TestClassc2=c1;//c1给了c2c2.Id=1;c2.Name=”a”;
Console.WriteLine($”c1[{c1.Id},{c1.Name}]”);//测验值类型TestStructs1=newTestStruct{Id=0,Name=”未界说”};
TestStructs2=s1;//s1给了s2s2.Id=2;s2.Name=”b”;
Console.WriteLine($”s1[{s1.Id},{s1.Name}]”);
Console.ReadKey();
}
}
最终看成果
完毕
好了,成果显而易见。
c1和s1我一直没有动过它,s1(值类型)倒是乖乖的,但是c1(引证类型)却跟着c2变了,由此我们能够想到
值类型的每一次赋值都会执行一次逐字段的复制,引证类型的赋值仅仅指针的传递,其实也是生成新的指针实例。
也就是说,我们在c1和c2之间进行值传递的时候,传的其实仅仅内存地址而已。就像你有一张银行卡,你用它绑了支付宝又用它绑了微信,不管你用哪个app去买包子,花的都是你银行卡里的钱
最终,遇到这个坑别忘了跳一跳,摔到里边真的挺疼的
C#中关于值类型和引证类型的区别
未经允许不得转载:IT技术网站 » C#中关于值类型和引证类型的区别
评论前必须登录!
注册