C#数组参数参考[重复]

Posted

技术标签:

【中文标题】C#数组参数参考[重复]【英文标题】:C# array parameter reference [duplicate] 【发布时间】:2018-01-05 00:31:32 【问题描述】:

我有一个 C# 代码如下:

int[] A = new int[] 1, 2, 3;
fun(A);
// A at this point still says 1, 2, 3.

void fun(int[] A)

   int[] B = new int[] 4, 5, 6;
   A = B;

我认为所有数组都是在 C# 中通过引用传递的。 A调用fun()后不应该反映4、5、6吗?

【问题讨论】:

您必须修改对 A 的原始引用,您永远不会这样做。见the docs 数组的元素是通过引用传递的,而不是数组本身。见:***.com/questions/967402/… 做例子的时候不要在多个地方使用同一个名字,这样就很难讲你的例子了,传入函数的参数名和变量名应该有有两个不同的名称,以使示例更易于讨论。 @ArchieGertsman 不,元素不是通过引用传递的。只有一个变量被传递,它被传递按值,但该值是一个引用。数组值被引用,但它们根本没有通过引用或其他方式“传递”。 @Servy 我的错误。但该链接仍然有效。 【参考方案1】:

我以为所有数组都是在 C# 中通过引用传递的

实际上(原始数组对象的引用是按值传递的),这是 C# 中引用类型的常见行为。

您的理解是部分正确的,引用被传递,但通过值传递,这意味着创建了一个指向原始数组对象A的新引用。

fun(int[] A) 有它自己的引用副本,它指向包含 1,2,3 的数组对象,在 fun 中创建一个新的数组对象 B 和您只是将 new 的引用分配给本地方法引用变量,这当然不会对作为输入传递给 fun 的原始 A 对象产生任何影响。

如果您想在fun 中反映对A 所做的更改以反映回原始数组对象,则需要通过引用传递它。

您可以在不通过引用传递的情况下更新数组项,这在Scott Chamberlain's answer中有很好的解释

希望对你有帮助!

【讨论】:

所以你说数组是通过引用传递的,然后稍后在同一句话中,说它们是通过值传递的。不,数组不是通过引用传递的,所以不要说它们是。 原始数组对象的引用是传值的 @是的,这是正确的,不像你的答案中的粗体声明说数组是通过引用传递的,这是错误的。 我已经更新了我的帖子,使其更加清晰,以免混淆。【参考方案2】:

数组是通过 a 引用传递的,您可以通过在另一个方法中执行 A[0] = 7; 来看到这一点。

该引用(由外部变量A 持有),但是通过值传递给函数。复制引用并创建一个新变量并将其传递给函数。函数外的变量不受函数内参数变量A重新赋值的影响。

要更新原始变量,您需要使用ref 关键字,以便函数内部的参数表示与函数外部相同的对象。

int[] A = new int[] 1, 2, 3;
fun2(A);
// A at this point says 7, 2, 3.
fun(ref A);
// A at this point says 4, 5, 6.

void fun2(int[] a)

   a[0] = 7;


void fun(ref int[] a)

   int[] B = new int[] 4, 5, 6;
   a = B;

【讨论】:

The array is passed by reference 不,它是按值传递的,从 OP 的代码可以看出。如果该陈述属实,那么 OP 的代码将按照他们的预期执行,而不是实际执行的操作。 @Servy 做了一些改写 现在这句话没有意义了。您的意思是说数组传递的 is 是一个引用,而不是 by 一个引用?

以上是关于C#数组参数参考[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C# 数组 - string[][] 与 string[,] [重复]

C#编写一个方法,去除数组中重复数据。

[转载]C#如何清除字符串数组中的重复项

c# 请问数组能作为参数传递吗? 如果可以如何传递呢?

c# sql 参数数组 执行?

从字节数组转换为字符串十六进制c# [重复]