通过ref 传递List

可能重复:
通过ref传递对象

使用下面的代码,输出将是:

Without: With:1 

码:

  static void Main(string[] args) { var listWithoutRef = new List(); WithoutRef(listWithoutRef); Console.WriteLine("Without:" + string.Join(" ", listWithoutRef)); var listWithRef = new List(); WithRef(ref listWithRef); Console.WriteLine("With:" + string.Join(" ", listWithRef)); } static void WithoutRef(List inList) { inList = new List(new int[] { 1 }); } static void WithRef(ref List inList) { inList = new List(new int[] { 1 }); } 

通过观察这个,我会说List上有一个List,所以无论如何都是由ref传递的,所以它们应该是一样的吗? 我误解了ref关键字吗? 还是我错过了别的什么?

我误解了ref关键字吗? 还是我错过了别的什么?

是。 您没有将列表本身传递给方法,而是通过引用引用传递给列表 。 这允许您更改方法中的引用( listWithRef实际引用的List ),并使其反映出来。

如果不使用ref关键字,则您的方法无法更改对列表的引用 – 实际列表存储机制在任何一种情况下都不会更改。

请注意,如果您只想使用该列表,则不需要这样做。 例如,您可以在任一方法中调用List.Add ,并且列表将添加新项目。 Ref仅在引用类型中需要更改引用本身。

是的,所有List对象都以任一方式存储在堆上。 但是,如果没有ref关键字,则无法重新分配inList参数并使其影响调用方的范围。 当您创建一个新的List对象时,它将作为新对象在堆上运行,但除非您使用ref关键字,否则调用者范围中的原始引用不会受到影响。

WithoutRef ,如果您在现有List上调用方法而不重新定义它,您将看到它被修改:

 inList.Clear(); inList.Add(1);