C#数组参数参考
我有一个C#代码如下:C#数组参数参考,c#,arrays,C#,Arrays,我有一个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() 我认为所有数组在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()
我认为所有数组在C中都是通过引用传递的#
实际上(原始数组对象的引用是通过值传递的,),这是C#中引用类型的常见行为
您的理解部分正确,引用是通过值传递的,这意味着将创建一个指向原始数组对象a
的新引用
fun(int[]A)
有自己的引用副本,该副本指向包含1,2,3的数组对象,在fun
中,您创建了一个新的数组对象B
,您只需将新对象的引用分配给您的局部方法引用变量,这当然不会对原始对象产生任何影响作为输入传递给fun
的对象
如果要将fun
中对A
所做的更改反映回原始数组对象,则需要通过引用传递它
您可以在不通过引用传递的情况下更新数组项,这在中有很好的解释
希望有帮助
我认为所有数组在C中都是通过引用传递的#
实际上(原始数组对象的引用是通过值传递的,),这是C#中引用类型的常见行为
您的理解部分正确,引用是通过值传递的,这意味着将创建一个指向原始数组对象a
的新引用
fun(int[]A)
有自己的引用副本,该副本指向包含1,2,3的数组对象,在fun
中,您创建了一个新的数组对象B
,您只需将新对象的引用分配给您的局部方法引用变量,这当然不会对原始对象产生任何影响作为输入传递给fun
的对象
如果要将fun
中对A
所做的更改反映回原始数组对象,则需要通过引用传递它
您可以在不通过引用传递的情况下更新数组项,这在中有很好的解释
希望有帮助 数组通过a引用传递,您可以通过执行a[0]=7来看到这一点代码>来自另一个方法内部
但是,该引用(由外部变量A
)通过值传递给函数。复制引用并创建新变量并将其传递给函数。函数外部的变量不受函数内部参数变量A
重新分配的影响
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;
}
要更新原始变量,需要使用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;
}
数组通过a引用传递,您可以通过执行a[0]=7来看到这一点代码>来自另一个方法内部
但是,该引用(由外部变量A
)通过值传递给函数。复制引用并创建新变量并将其传递给函数。函数外部的变量不受函数内部参数变量A
重新分配的影响
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;
}
要更新原始变量,需要使用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;
}
您必须修改对A的原始引用,您永远不会这样做。请参见,数组的元素是通过引用传递的,而不是数组本身。请参阅:在制作示例时,不应在多个位置使用相同的名称,这会使您的示例很难讨论,传递给函数的参数名称和变量名称应该是两个不同的名称,以使示例更易于讨论。@ArchieGertsman不,元素不是通过引用传递的。只传递一个变量,它是通过值传递的,但该值是一个引用。数组值被引用,但它们根本不是通过引用或其他方式“传递”的。@请注意我的错误。但是这个链接仍然有效。你必须修改对A的原始引用,你永远不会这样做。请参见,数组的元素是通过引用传递的,而不是数组本身。请参阅:在制作示例时,不应在多个位置使用相同的名称,这会使您的示例很难讨论,传递给函数的参数名称和变量名称应该是两个不同的名称,以使示例更易于讨论。@ArchieGertsman不,元素不是通过引用传递的。只传递一个变量,它是通过值传递的,但该值是一个引用。数组值被引用,但它们根本不是通过引用或其他方式“传递”的。@请注意我的错误。但是这个链接仍然有效。数组是通过引用传递的
不,它是通过值传递的,从OP的代码中可以看出。如果那句话是真的,那么OP的代码会做他们期望它做的事情,而不是它实际做的事情。@Servy做了一些改写现在这句话没有意义了。你的意思是说传递的数组是引用,而不是引用?数组是通过引用传递的
否,它是通过值传递的,从OP的代码中可以看出。如果那句话是真的,那么OP的代码会做他们期望它做的事情,而不是它实际做的事情。@Servy做了一些改写现在这句话没有意义了。你的意思是说传递的数组是引用,而不是引用?所以你说数组是通过引用传递的,