You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中值类型按引用传递的疑问:为何调用方变量值会改变?

问题解答

你的困惑核心是混淆了C#中不同参数传递方式的适用场景,以及对文档描述的误解,下面逐一解释:

1. 澄清文档描述的真实适用场景

你贴的文档里那段关于“按引用传递值类型”的描述,表述容易误导——它真正对应的是引用类型按值传递的场景,而非值类型按引用传递。正确的参数传递规则如下:

按值传递(默认,无ref/out修饰符)

  • 值类型:方法接收原变量值的副本,修改副本不会影响原变量。
  • 引用类型:方法接收原变量引用的副本:
    • 若修改副本指向对象的状态(比如给List添加元素),原变量指向的对象会同步变化;
    • 若把副本赋值为指向新对象(比如param = new List<string>()),这个变化不会影响原变量的引用。

按引用传递(使用ref/out/in修饰符)

不管是值类型还是引用类型,方法接收的都是原变量本身的内存引用:

  • 对参数的任何修改(包括赋值新值/新对象),都会直接反映到原变量上。

2. 解释示例中的现象

你看的示例用了ref修饰符,属于值类型按引用传递:

void Method(ref int refArgument){
    refArgument = refArgument + 44;
}
int number = 1;
Method(ref number);
Console.WriteLine(number); // Output: 45

这里refArgument是原变量number的直接引用,方法里的赋值操作refArgument = refArgument +44,本质是直接修改number所在内存地址的值,所以原变量会同步更新为45。

3. 关于“指向不同对象”的误解

值类型本身不存在“指向对象”的概念——值类型的实例直接存储在栈内存中,不是通过引用指向堆对象。文档里的“赋值为指向不同对象”描述,只适用于引用类型的场景,和值类型无关。

内容的提问来源于stack exchange,提问作者Deva Raja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 13:41:38