数组或列表默认是通过c#中的引用传递的吗?

时间:2009-06-08 22:45:15

标签: c# arrays reference

他们呢?或者为了加快我的程序,我应该通过引用传递它们吗?

4 个答案:

答案 0 :(得分:183)

引用按值传递

.NET中的数组是堆上的对象,因此您有一个引用。该引用按值传递,这意味着调用者将看到对数组的内容的更改,但重新分配数组将不会:

void Foo(int[] data) {
    data[0] = 1; // caller sees this
}
void Bar(int[] data) {
    data = new int[20]; // but not this
}

如果添加ref修饰符,引用将通过引用传递 - 并且调用者将看到上面的更改。

答案 1 :(得分:7)

它们按值传递(所有参数既不是ref也不是out),但值对对象的引用,因此它们通过引用有效传递。

答案 2 :(得分:0)

是的,它们默认在C#中通过引用传递。除了值类型之外,C#中的所有对象都是。为了更精确一点,它们通过“按价值参照”传递;也就是说,您在方法中看到的变量的值是对传递的原始对象的引用。这是一个很小的语义点,但有时候很重要。

答案 3 :(得分:0)

(1) 没有人明确回答 OP 的问题,所以这里是:

  • 没有。显式传递数组或列表作为引用不会影响性能。
  • 避免了 OP 担心可能发生的事情,因为该函数已经在对引用(按值传递)进行操作。最佳答案很好地解释了这意味着什么,为宜家提供了回答原始问题的方法。

(2) 给大家的好建议:

  • 阅读 Eric Lippert 关于何时/如何进行优化的建议。过早的优化是万恶之源。

(3) 重要,尚未提及:

  • 需要通过引用传递任何东西(值或引用)的用例很少见。
  • 这样做为您提供了额外的方法来让自己在脚下开枪,这就是 C# 也让您在方法调用中使用“ref”关键字的原因。较旧的(Java 之前的)语言只会让您在方法声明中指示传递引用。这招来了无穷无尽的问题。 Java 吹嘘它根本不允许你这样做。