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

C#中List作为参数传递时重新赋值未生效的原因咨询

问题解答

首先明确C#的参数传递核心规则:
默认情况下,C#所有参数都是按值传递,与参数类型是值类型/引用类型无关。

引用类型的变量存储的并非对象本身,而是堆中对应实例的内存地址。你传递引用类型参数时,实际是把这个地址复制了一份给方法形参,此时形参和外部实参指向同一个堆对象,但二者是完全独立的两个变量。

两种方法的差异原因:

  • 调用ClearLines(list)时,你是通过形参持有的地址,直接修改了二者共同指向的堆实例的内部数据(清空列表元素),外部实参访问同一个实例时自然会看到修改结果,所以输出为0。
  • 调用NewLines(list)时,你是直接给形参这个独立变量重新赋值了新的内存地址(指向新创建的空List实例),这个修改只会改变形参本身的指向,完全不会影响外部实参的存储内容,外部实参依然指向原来包含1个元素的List,所以输出为1。

如果希望修改形参指向时同步影响外部实参,需要显式使用ref关键字声明按引用传递,示例如下:

// 方法声明添加ref关键字
private static void NewLines(ref List<string> lines)
{
    lines = new List<string>();
}

// 调用时也需要添加ref关键字
NewLines(ref list);
Console.WriteLine(list.Count); // 此时输出为0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:06:03