当前位置: 首页 > news >正文

【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关键字: 可以让方法直接修改原始参数
http://www.cnnetsun.cn/news/103571.html

相关文章:

  • Photoshop图层批量导出终极指南:10倍效率提升的完整教程
  • 【每日算法】LeetCode 739. 每日温度:从暴力遍历到单调栈的优雅解决
  • Golin终极指南:网络安全扫描与等保核查的完整解决方案
  • 77、由于您仅提供了“以下”两个字,没有具体的英文内容,所以我无法按照要求为您生成博客,请您提供完整的英文内容。
  • Grafana中文版终极指南:快速搭建专业数据可视化监控平台
  • 4、Mac OS X系统使用指南:从Launchd到Shell操作
  • 6、Mac OS X 文件操作全攻略
  • XXPermissions深度解析:Android权限框架的架构揭秘与实践指南
  • PDF翻译格式错乱终极解决方案:三步实现完美排版修复
  • 41、深入了解 IPv6:从基础到实践
  • 47、搭建 Linux 拨号服务器与网络故障排查全攻略
  • 3步轻松掌控电脑风扇:FanControl免费调校完整教程
  • 49、网络故障排查工具大全及使用指南
  • WordPress导入pdf识别图表生成代码片段
  • WordPress支持wps文档导入保留格式样式
  • 开源AI编程工具的商业化破局:Continue的可持续生态构建
  • UVa 12619 Just Make A Wish
  • 直播间数据监控终极指南:如何快速获取弹幕、礼物与用户行为数据
  • CellProfiler生物图像分析完全指南:从入门到精通
  • B站视频下载完全指南:新手必备的简单三步教程
  • KISS FFT:重新定义轻量级信号处理的工程艺术
  • 6、常见WRT54G第三方固件全解析
  • 3步构建企业级3D抽奖系统:从策划到落地的完整解决方案
  • LDDC:3大平台歌词获取,打造专属音乐体验
  • EmotiVoice是否内置语音质量检测模块?MOS预估功能上线
  • EmotiVoice能否用于外语学习跟读训练?发音准确性评估
  • 从零开始的编程冒险:游戏化学习如何让你爱上写代码
  • NocoDB云原生部署实战:构建企业级低代码数据平台
  • drawio-libs:重新定义专业图表绘制的智能图标生态
  • Vue-CodeMirror6 完整配置与最佳实践指南