通过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
,并且列表将添加新项目。 Ref仅在引用类型中需要更改引用本身。
是的,所有List
对象都以任一方式存储在堆上。 但是,如果没有ref
关键字,则无法重新分配inList
参数并使其影响调用方的范围。 当您创建一个新的List
对象时,它将作为新对象在堆上运行,但除非您使用ref关键字,否则调用者范围中的原始引用不会受到影响。
在WithoutRef
,如果您在现有List
上调用方法而不重新定义它,您将看到它被修改:
inList.Clear(); inList.Add(1);