我应该通过引用还是通过值传递大的List <int>?</int>

时间:2015-04-15 12:24:50

标签: c#

List<int> Integers = new List<int>();

SomeMethod1(ref Integers);
SomeMethod2(Integers);

我们正在使用大型列表,并想知道什么更有效? 如果Call-By-Value复制整个列表,我们假设Call-By-Reference是最有效的?这是真的吗?

4 个答案:

答案 0 :(得分:7)

这是C#,而不是C ++。 List<T>是一种引用类型,因此在这两种情况下都不会进行复制。

唯一的区别是,在第一种情况下,SomeMethod1将能够修改调用者中的Integers变量,例如,通过在其中设置不同的列表对象

void SomeMethod1(ref List<int> list) {
    list = new [] {1, 2, 3}.ToList(); // Modifies Integers in the caller
}

虽然SomeMethod2无法修改变量(但它可以修改列表)。

void SomeMethod2(List<int> list) {
    list.Add(123); // Modifies the list passed as Integers
    list = new [] {1, 2, 3}.ToList(); // Integers in the caller references the old list
}

因此,应该驱动您选择List<int>的参数传递机制的是您是否希望SomeMethodX能够修改调用者中的变量。

答案 1 :(得分:0)

由于List<>class,因此使用第二种方法也会将对象作为参考传递。

相反,如果您的收藏是struct,那将是另一种情况。默认情况下,结构按值传递。因此,关键字ref会有意义。

答案 2 :(得分:0)

通常SomeMethod()会想要阅读或修改(而不是替换)列表,例如通过添加或删除元素;使用ref或不使用ref都可以同样正常工作。在任何情况下都不会复制穿着名单;正常调用(没有引用)将复制引用(即4或8个字节),而ref调用将复制指向该引用的指针(相同大小)。

使用ref表示您想要通过用全新列表替换整个列表对象来更改调用者的引用所指向的内容。这完全是可能的,但不完全是典型的。如果您实际上不想替换原始列表,那么引用可能会使您的读者感到困惑(但不会立即造成伤害)。

答案 3 :(得分:0)

您的代码中不需要参考。

仅当您打算更改变量引用的内容时,才应使用ref

请记住,List是引用类型;它不可能通过值传递