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

C#函数为何表现为按引用传递?数组参数修改问题咨询

为什么C#中传递数组到方法后,修改元素会影响原数组?

这是个非常常见的C#新手误区,我来给你理清楚其中的逻辑~

首先要明确一个核心知识点:在C#里,数组是引用类型,而你混淆了「值传递」和「引用类型的传递机制」。

先搞懂C#的参数传递逻辑

C#里的参数默认是按值传递的,但这里的「值」对于不同类型是不一样的:

  • 值类型(比如int、bool、自定义struct):传递的是变量的完整副本,方法里修改这个副本完全不会影响原变量。
  • 引用类型(数组、自定义class、委托等):传递的是「对象引用的副本」——也就是说,方法里的参数变量和原变量,指向的是堆内存里同一个对象实例。

结合你的示例代码分析

看你写的这段代码:

static void Main(string[] args) { 
    bool[] Test = new bool[] { false, false, false, false }; 
    ExampleFunction(Test); 
    if(Test[0]) { 
        Console.WriteLine("A"); 
    } else { 
        Console.WriteLine("B"); 
    } 
    Console.ReadLine(); 
}
static bool ExampleFunction(bool[] TestArray) { 
    TestArray[0] = true; 
    return true; 
}
  1. 主方法里创建的Test数组,实际存储在堆内存中,Test变量本身只是存了一个指向堆数组的地址。
  2. 调用ExampleFunction(Test)时,会把这个地址复制一份传给参数TestArray——此时TestArray和Test指向的是同一个堆数组。
  3. 在方法里执行TestArray[0] = true,本质是直接修改了堆数组的第一个元素值,而不是修改TestArray这个变量本身。
  4. 回到主方法后,Test依然指向那个堆数组,所以Test[0]自然变成了true,最终输出"A"。

再说说你疑惑的ref关键字

你以为只有用ref才会影响原变量,其实ref的作用和这个场景不一样:

  • 不用ref时,你只能修改引用指向的对象的内部状态(比如数组元素、类的属性),但如果在方法里给参数重新赋值(比如TestArray = new bool[4];),原变量不会受到影响。
  • 用ref时,传递的是「变量本身的引用」,这时候你不仅能修改对象内部状态,甚至可以给参数重新赋值,原变量也会同步指向新的对象。

举个简单的对比例子:

// 不用ref的情况,重新赋值参数不影响原变量
static void NoRefExample(bool[] arr) {
    arr = new bool[] { true, true }; // 这行不会改变主方法里的原数组
}

// 用ref的情况,重新赋值参数会影响原变量
static void RefExample(ref bool[] arr) {
    arr = new bool[] { true, true }; // 主方法里的原数组变量会指向这个新数组
}

总结

你遇到的情况是C#引用类型的正常行为:数组作为引用类型,传递的是引用的副本,所以修改数组的元素会直接影响原数组;而ref关键字是用于让你能修改参数变量本身的指向,并非修改对象内部状态的必要条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:15:52