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

C#方法 值传递 引用传递

一、核心前提调用方法传递参数时默认发生值传递值传递中值类型与引用类型的表现完全不同具体分两种情况单独说明值类型参数传递实参的值拷贝形参修改不影响实参引用类型参数传递实参的地址拷贝形参与实参指向同一对象引用传递需通过ref关键字显式声明并非默认传递方式二、值传递核心传递的是“拷贝”值拷贝/地址拷贝形参与实参本质相互独立引用类型除外指向同一对象分两种参数类型说明。一值传递值类型参数对应Test1方法1. 核心规则将实参的值拷贝一份赋值给形参方法体内修改形参的值不会影响调用时实参的值形参、实参相互独立2. 实战示例Test1// 调用代码 int a1 10; Test1(a1); // 实参a1的值10拷贝给形参a Console.WriteLine(a1的值是 a1); // 输出a1的值是10未被修改 // 方法定义值类型参数int public static void Test1(int a) { Console.WriteLine(a修改之前的值 a); // 输出10 a 20; // 修改形参a的值不影响实参a1 }二值传递引用类型参数对应Test2方法1. 核心规则将实参对象的内存地址拷贝一份赋值给形参形参和实参指向同一个内存地址本质是同一个对象两种修改方式及影响关键区分方式1通过对象.属性的方法修改 → 影响实参的对象值方式2通过new创建新对象改变形参指向 → 不影响实参的对象值2. 实战示例Test2// 前置准备自定义People类 public class People { public string Name { get; set; } } // 调用代码 People p1 new People() { Name 张三 }; Test2(p1); // 实参p1的地址拷贝给形参p Console.WriteLine(p1对象name值 p1.Name); // 输出李四被修改 // 方法定义引用类型参数People public static void Test2(People p) // 形参p与实参p1指向同一个对象 { Console.WriteLine(修改之前 p.Name); // 输出张三 // 方式1对象.属性修改影响实参 p.Name 李四; // 方式2new创建新对象不影响实参注释后不执行 // p new People() {Name李四 }; }三、引用传递ref关键字显式声明核心传递的是“同一引用”形参与实参完全绑定修改形参必影响实参分两种参数类型说明表现统一。一引用传递ref修饰值类型对应Test1方法1. 核心规则需用ref关键字同时修饰形参和实参调用时实参前必须加ref形参与实参指向同一个变量无拷贝完全绑定方法体内修改形参的值必然影响外部实参的值注意ref修饰的值类型参数调用前必须赋初始值否则报错2. 实战示例Test1// 引用传递:在方法内部修改形参值会影响到外部实参的值 // 调用代码 int a1 10; // ref参数必须赋初始值 Test1(ref a1); // 如果参数有ref关键字需要调用的时候实参前面添加ref关键字 Console.WriteLine(a的值为 a1); // 输出20实参被修改 // 方法定义ref修饰值类型参数int // ref:关键字的作用 把形参传值改成引用类型传值的形式通俗讲把方法内部形参和外部实参表示同一个 public static void Test1(ref int a) { a 20;// 此处修改会影响到外部a1值 }二引用传递ref修饰引用类型对应Test2方法1. 核心规则需用ref关键字同时修饰形参和实参调用时实参前必须加ref形参与实参指向同一个对象无地址拷贝完全绑定无论通过对象.属性修改还是new创建新对象都会影响外部实参2. 实战示例Test2// 验证参数是对象类型的时候前提参数使用ref关键字进行修饰不管对象.属性方式修改还是整体new对象方式修改 都会影响到实参 // 调用代码 People p1 new People() { Name 烧饼 }; Test2(ref p1); Console.WriteLine(p1.Name); // 对象.属性方式进行修改的话 这地方也会跟着变化武大郎 // 如果通过new修改整体对象 这地方也会跟着变化武大郎 // 方法定义ref修饰引用类型参数People // 传递People类型 public static void Test2(ref People a) { // 第一种修改 对象.属性进行 //a.Name 武大郎; // 第二种方式 通过new的方法修改整个对象 a new People() { Name 武大郎 }; }四、值传递与引用传递核心区别触发方式值传递默认触发引用传递需ref关键字显式声明传递内容值传递传“拷贝”值/地址引用传递传“同一引用”实参影响值传递值类型不影响引用类型改属性影响、new不影响引用传递无论类型修改必影响关键区分贴合代码总结值传递 在方法内部修改变量不会影响到外部如果对象.属性这种方式会影响到外部引用传递必须有ref 在方法内部修改变量会影响到外部五、高频易错点必避坑混淆值类型与引用类型的值传递误以为所有值传递都不影响实参引用类型通过属性修改会影响引用类型中new创建新对象后值传递不影响实参ref修饰的引用传递仍影响实参默认传递都是值传递并非引用类型默认是引用传递ref参数值类型未赋初始值就调用会报语法错误调用ref修饰的方法时实参前忘记加ref关键字会报语法错误六、核心总结值传递默认值类型传值拷贝不影响实参引用类型传地址拷贝改属性影响、new不影响引用传递ref显式声明、实参加ref形参与实参同一引用修改必影响实参所有类型适用ref值类型需初始化ref引用类型无论改属性还是new都影响实参核心区别值传递是“拷贝引用/值”引用传递是“共享同一引用”
http://www.gsyq.cn/news/1339177.html

相关文章:

  • 跨境电商创业的效率法则:用“500块+3天”原则实现低成本快速试错
  • YOLO26涨点改进| TGRS 2026 | 独家创新首发、注意力改进篇| 引入MCSA多尺度通道空间注意力,含二次创新多种改进点,助力小目标检测、图像分割、遥感目标检测、图像修复任务涨点
  • 体验Taotoken模型广场快速选型与切换不同厂商模型的过程
  • Cur-Lip/Dox双药控释可注射水凝胶的网络结构
  • 昆山奢侈品回收行业综合实力排名TOP6,2026年5月权威测评榜单 - 天天生活分享日志
  • 蒸汽咨询正规机构吗 - 技研备忘录
  • 贪吃蛇游戏(代码+超详细注释)
  • 基于STM32+RTOS智能家居控制系统实现(已实现全部功能)
  • 【Redis -01】Redis 零基础运维实战!全网最常用 Linux 命令大全(工作直接抄)
  • 苹果手机快速开启开发者模式教程(iOS 16+)
  • AMD Ryzen终极调试工具:硬件级性能调优完全指南
  • 终极指南:119,376个英语单词发音MP3音频一键下载完整教程 [特殊字符]
  • 2026年新品:资深高压锅炉管研发厂家 - 品牌推广大师
  • 给OpenWrt路由器写个简易“设备管家”:用Shell脚本自动记录并通知新设备上线
  • 听完了AMD的AI开发者大会,我算清了两笔账!
  • 深度学习视频压缩技术解析与应用实践
  • 贵阳西服定制标杆:老合兴洋服,凭四大核心优势圈粉无数 - 贵州服装测评君
  • 如何快速掌握uesave:Unreal引擎存档编辑的完整指南
  • RT-DETRv2训练自定义数据集的排坑全记录
  • AI设计泳装,能颠覆今夏潮流?
  • 冲压送料机远程监控运维管理系统方案
  • Python利用openpyxl库写入或修改xlsx文件
  • 学生心理测评系统哪家好?2026谁能守护青少年心理健康? - 健成星云
  • 使用 curl 命令直接测试 Taotoken 聊天接口的连通性与返回格式
  • 2026年4月市面上有名的活性炭公司口碑推荐,杏壳活性炭/净水活性炭/煤质柱状活性炭/食品级活性炭,活性炭品牌找哪家 - 品牌推荐师
  • 如何快速掌握SPT-AKI存档编辑器:离线版塔科夫玩家的终极修改指南
  • 影刀RPA跨境店群运营架构:TikTok Shop与TEMU高并发Python调度引擎实战
  • 越南语TTS合规生死线:GDPR+越南《个人数据保护法令》双框架下ElevenLabs语音日志清理SOP
  • 使用Taotoken后API调用稳定性与延迟的实际体验观察
  • 【仅限前500名设计师获取】Midjourney双色调调色板生成器(含17组经Adobe Color验证的高转化配色矩阵)