news 2026/4/12 2:29:44

【C#】C#中值类型和引用类型参数传递的区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【C#】C#中值类型和引用类型参数传递的区别

C#中值类型和引用类型参数传递的区别

1. C#中的参数传递机制

在C#中,参数传递主要分为两种情况:

  • 值类型传递 :传递的是变量的副本,方法内的修改不会影响原始变量。
  • 引用类型传递 :传递的是对象引用的副本,方法内对对象属性的修改会影响原始对象。

普通函数参数传递的区别主要取决于参数的类型:

  • 如果参数是值类型 (如int、struct等):方法内的修改不会影响原始变量。
  • 如果参数是引用类型 (如class、interface等):方法内对对象属性的修改会影响原始对象。

示例

usingSystem;namespaceParamPassingDemo{// 引用类型(类)classPerson{publicstringName{get;set;}publicintAge{get;set;}publicoverridestringToString(){return$"Person{{Name='{Name}', Age={Age}}}";}}// 值类型(结构体)structPoint{publicintX{get;set;}publicintY{get;set;}publicoverridestringToString(){return$"Point{{X={X}, Y={Y}}}";}}classProgram{// 修改引用类型参数的方法staticvoidModifyPerson(Personperson){// 直接修改引用指向的对象的属性person.Name="Modified Alice";person.Age=30;Console.WriteLine($"ModifyPerson方法内:{person}");}// 修改值类型参数的方法staticvoidModifyPoint(Pointpoint){// 修改的是副本的属性point.X=100;point.Y=200;Console.WriteLine($"ModifyPoint方法内:{point}");}// 创建新对象并赋值给引用参数staticvoidReplacePerson(Personperson){// 创建新对象并赋值给参数(修改的是参数指向的引用)person=newPerson{Name="New Person",Age=40};Console.WriteLine($"ReplacePerson方法内:{person}");}// 使用ref关键字传递值类型staticvoidModifyPointRef(refPointpoint){// 修改的是原始对象的属性point.X=100;point.Y=200;Console.WriteLine($"ModifyPointRef方法内:{point}");}staticvoidMain(string[]args){Console.WriteLine("=== C# 参数传递演示 ===");Console.WriteLine();// 1. 引用类型参数传递Console.WriteLine("1. 引用类型(类)参数传递:");Personalice=newPerson{Name="Alice",Age=25};Console.WriteLine($"调用前:{alice}");ModifyPerson(alice);Console.WriteLine($"调用后:{alice}");Console.WriteLine("结论: 引用类型参数传递时,方法内对对象的修改会影响原始对象");Console.WriteLine();// 2. 值类型参数传递Console.WriteLine("2. 值类型(结构体)参数传递:");Pointp1=newPoint{X=10,Y=20};Console.WriteLine($"调用前:{p1}");ModifyPoint(p1);Console.WriteLine($"调用后:{p1}");Console.WriteLine("结论: 值类型参数传递时,方法内的修改不会影响原始对象");Console.WriteLine();// 3. 替换引用类型参数指向的对象Console.WriteLine("3. 替换引用类型参数指向的对象:");Personbob=newPerson{Name="Bob",Age=35};Console.WriteLine($"调用前:{bob}");ReplacePerson(bob);Console.WriteLine($"调用后:{bob}");Console.WriteLine("结论: 替换参数指向的引用不会影响原始对象");Console.WriteLine();// 4. 使用ref关键字传递值类型Console.WriteLine("4. 使用ref关键字传递值类型:");Pointp2=newPoint{X=50,Y=60};Console.WriteLine($"调用前:{p2}");ModifyPointRef(refp2);Console.WriteLine($"调用后:{p2}");Console.WriteLine("结论: 使用ref关键字可以让方法修改原始值类型对象");Console.WriteLine();Console.WriteLine("=== 总结 ===");Console.WriteLine("1. 值类型: 默认传递副本,方法内修改不影响原始对象");Console.WriteLine("2. 引用类型: 默认传递引用的副本,方法内修改对象属性会影响原始对象");Console.WriteLine("3. 替换引用: 修改参数指向的引用不会影响原始对象");Console.WriteLine("4. ref关键字: 可以让方法直接修改原始参数");}}}

运行结果

===C# 参数传递演示 ===1. 引用类型()参数传递: 调用前: Person{Name='Alice',Age=25}ModifyPerson方法内: Person{Name='Modified Alice',Age=30}调用后: Person{Name='Modified Alice',Age=30}结论: 引用类型参数传递时,方法内对对象的修改会影响原始对象2. 值类型(结构体)参数传递: 调用前: Point{X=10,Y=20}ModifyPoint方法内: Point{X=100,Y=200}调用后: Point{X=10,Y=20}结论: 值类型参数传递时,方法内的修改不会影响原始对象3. 替换引用类型参数指向的对象: 调用前: Person{Name='Bob',Age=35}ReplacePerson方法内: Person{Name='New Person',Age=40}调用后: Person{Name='Bob',Age=35}结论: 替换参数指向的引用不会影响原始对象4. 使用ref关键字传递值类型: 调用前: Point{X=50,Y=60}ModifyPointRef方法内: Point{X=100,Y=200}调用后: Point{X=100,Y=200}结论: 使用ref关键字可以让方法修改原始值类型对象===总结===1. 值类型: 默认传递副本,方法内修改不影响原始对象2. 引用类型: 默认传递引用的副本,方法内修改对象属性会影响原始对象3. 替换引用: 修改参数指向的引用不会影响原始对象4. ref关键字: 可以让方法直接修改原始参数
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/10 18:44:15

百度网盘秒传工具怎么用?5分钟学会快速转存技巧

百度网盘秒传工具怎么用?5分钟学会快速转存技巧 【免费下载链接】baidupan-rapidupload 百度网盘秒传链接转存/生成/转换 网页工具 (全平台可用) 项目地址: https://gitcode.com/gh_mirrors/bai/baidupan-rapidupload 还在为百度网盘下载速度慢而烦恼吗&…

作者头像 李华
网站建设 2026/4/11 18:23:43

EmotiVoice语音样本展示平台搭建实践:在线试听系统开发记录

EmotiVoice语音样本展示平台搭建实践:在线试听系统开发记录 在智能语音内容爆发的今天,用户早已不再满足于“能说话”的机械音。无论是虚拟主播、AI教师,还是游戏中的角色对话,大家期待的是有情绪、有温度的声音——那种一听就能感…

作者头像 李华
网站建设 2026/4/5 20:54:30

【数据库】不止兼容:金仓数据库的三重革新,开启智能部署、精准安全与性能洞察新时代

兼容 是对企业历史投资的尊重 是确保业务平稳过渡的基石 然而 这仅仅是故事的起点 在数字化转型的深水区,企业对数据库的需求早已超越“语法兼容”的基础诉求。无论是核心业务系统的稳定运行,还是敏感数据的安全防护,亦或是复杂场景下的性能优…

作者头像 李华
网站建设 2026/4/12 1:21:01

44、无干预网络安装新系统及串口控制台管理指南

无干预网络安装新系统及串口控制台管理指南 1. 搭建部分 Debian 镜像 在维护本地 Debian 镜像时,有时不需要完整的镜像,仅缓存和共享本地系统实际使用的包即可。可以使用 apt - proxy 实现这一目的。 - 安装 apt - proxy :在至少有 30GB 可用存储空间的服务器上执行以下…

作者头像 李华
网站建设 2026/4/9 23:40:05

EmotiVoice在车载语音系统中的潜力探讨

EmotiVoice在车载语音系统中的潜力探讨 在智能座舱逐渐成为“第三生活空间”的今天,用户对车载语音助手的期待早已超越了简单的“听懂指令、完成操作”。人们希望与车对话时,听到的不是冰冷机械音,而是一个能感知情绪、懂得安抚、甚至带着家人…

作者头像 李华