2017-07-28 189 views
0

我有一个C#代码如下: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#引用传递。拨打fun()后不应该反映4,5,6?

+0

你必须修改原来的引用,你永远不会做。请参阅[文档](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/passing-reference-type-parameters#passing-reference-types-by-值) – maccettura

+4

数组的元素通过引用传递,而不是数组本身。请参阅:https://stackoverflow.com/questions/967402/are-arrays-or-lists-passed-by-default-by-reference-in-c –

+0

当制作例子,你不应该在多个地方使用相同的名称,它使得很难谈论你的例子,参数的名称和传入函数的变量名应该是两个不同的名称,以使这个例子更容易讨论。 –

回答

1

该阵列由一个引用传递,则可以通过从另一方法内做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; 
} 
+0

'这个数组是通过引用传递的,不,它是按值传递的,从OP的代码中可以看出。如果该陈述是真实的,那么OP的代码将完成他们期望的代码,而不是实际执行的代码。 – Servy

+0

@Servy做了一些改编 –

+0

现在这句话没有意义。你的意思是说数组传递*是*引用,而不是*引用? – Servy

1

我认为所有阵列都通过引用在C#传递

实际上(原始数组对象的引用由值传递),这是通常的行为中引用类型的情况下,在C# 。

你的理解是部分正确,参考被传递,而是由值,这意味着一个新的参考被创建,其指向原始阵列对象A通过。

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

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

您可以更新数组项没有通过引用传递这是在Scott Chamberlain's answer

解释也希望它可以帮助!

+0

所以你说数组是通过引用传递的,然后*在同一个句子*中,说它们是按值传递的。不,数组*不通过引用传递,所以不要说它们是。 – Servy

+0

原始数组对象的引用通过值 –

+0

@Yes传递,这是正确的,不像回答中的粗体语句,即数组通过引用传递,这是错误的。 – Servy