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

Jor*_*nco 75 c# arrays reference

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

Mar*_*ell 193

参考被传递通过值.

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

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

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

  • 答案是正确的,但我有一种宠爱的人,他们说"参考是通过价值传递的".它混淆了这个问题.是的,引用(内存地址)按值传递,但这不是问题. (22认同)
  • @WernerVA我很感兴趣你认为你会以不同的方式表达它仍然*正确*和*明确* (8认同)
  • @Dan速度部分固有地链接到"如果数组按值传递 - 意味着数组内容的副本 - 这意味着分配和所有内存的副本".由于它是*参考*,所以没有性能问题需要回答 - 问题的这一部分没有实际意义并自动回答.除了现在,它在评论中也明确地回答了...... (7认同)
  • 我不会表达不同,也许只是更详细一点. (2认同)

pli*_*nth 8

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


Pau*_*ier -1

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

  • 引用是按值传递的;这与“它们通过引用传递”非常不同。 (11认同)
  • 这与事实完全相反。引用 [John Skeet 的这篇文章](https://devblogs.microsoft.com/csharpfaq/how-are-parameters-passed-in-c-are-they-passed-by-reference-or-by-value/) : "默认情况下,C# 中所有参数都是按值传递。只有显式包含 out 或 ref 修饰符时,参数才会按引用传递。但是,需要注意的是,当参数的类型为引用类型时,正在传递引用而不是实际对象”。它只是按值传递的引用(内存地址)。 (3认同)