在C#方法调用中,参数传递方式直接影响程序行为。本文通过代码示例和内存示意图,详解两种核心参数传递机制。
值参数(默认方式)
工作原理:
实参的值被复制到形参
static void MyMethod(MyClass f1, int f2) {f1.Val += 5; // 修改引用对象的字段 f2 += 5; // 仅修改局部副本
}
关键特性:
- 栈上为形参分配独立内存空间
- 值类型参数完全独立,引用类型参数共享对象(但引用本身被复制)
- 实参可以是变量或表达式
引用参数(ref参数)
工作原理:形参成为实参的别名
static void MyMethod(ref MyClass f1, ref int f2) {f1.Val += 5; // 修改原始引用指向的对象 f2 += 5; // 直接修改原始变量
}
关键特性:
- 必须在声明和调用时都使用ref修饰符
- 实参必须是已赋值的变量(不能是表达式)
- 对参数的所有修改都会反映到原始变量
核心差异对比
特性 | 值参数 | 引用参数(ref) |
---|---|---|
内存分配 | 创建新副本 | 使用原始变量内存地址 |
实参类型 | 变量或表达式 | 必须为已赋值的变量 |
方法外可见性 | 仅影响引用类型指向的对象 | 所有修改对外可见 |
性能影响 | 值类型有复制开销 | 无额外内存分配 |
实际开发建议
优先使用值参数:
保持代码隔离性,避免意外修改
ref使用场景:
- 需要返回多个值时(替代out参数)
- 处理大型值类型避免复制开销
- 需要修改原始值类型变量时
注意线程安全:
ref参数可能引发多线程环境下的竞态条件
思考题:当传递引用类型参数时,使用ref与否有何本质区别?欢迎在评论区留下你的见解!