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
相关产品推荐
相关产品推荐

