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#数组参数参考[重复]的主要内容,如果未能解决你的问题,请参考以下文章