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

IT技术2年前 (2022)发布 投稿用户
0

一直以来关于值类型与引证类型之间的差异都不是特别清晰,直到踩了坑….

正好最新空闲,便想着整理整理这一两年来遇到的奇葩问题和解决方案,趁便就把它给拎出来记一下,免得以后再摔跤
值类型与引证类型的差异
今日为了阐明值类型与引证类型的典型差异,预备把结构体(值类型)和类(引证类型)拉出来溜溜

C#


首要我们先界说一下
//////类///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去买包子,花的都是你银行卡里的钱
最终,遇到这个坑别忘了跳一跳,摔到里边真的挺疼的

© 版权声明
好牛新坐标 广告
版权声明:
1、IT大王遵守相关法律法规,由于本站资源全部来源于网络程序/投稿,故资源量太大无法一一准确核实资源侵权的真实性;
2、出于传递信息之目的,故IT大王可能会误刊发损害或影响您的合法权益,请您积极与我们联系处理(所有内容不代表本站观点与立场);
3、因时间、精力有限,我们无法一一核实每一条消息的真实性,但我们会在发布之前尽最大努力来核实这些信息;
4、无论出于何种目的要求本站删除内容,您均需要提供根据国家版权局发布的示范格式
《要求删除或断开链接侵权网络内容的通知》:https://itdw.cn/ziliao/sfgs.pdf,
国家知识产权局《要求删除或断开链接侵权网络内容的通知》填写说明: http://www.ncac.gov.cn/chinacopyright/contents/12227/342400.shtml
未按照国家知识产权局格式通知一律不予处理;请按照此通知格式填写发至本站的邮箱 wl6@163.com

相关文章