c#按值传递

时间:2010-06-27 08:02:03

标签: c#

嗨,大家好奇怪想看下面的例子

public void main()
{

   int x = 1;

   Foo(x);
}

public void Foo(int y)
{
    y = 5;
}

我们知道C#参数是按值类型的值传递的。这是否意味着在上面的例子中我在堆栈上有2个副本,一个用于x,一个用于y ??

由于

3 个答案:

答案 0 :(得分:14)

是的,堆栈上会有两个独立的变量。它们也将位于两个不同的堆栈帧中 - 一个用于main,另一个用于foo(假设没有内联)。当Foo返回时,x的值仍为1,而不是5。

实际上,对于引用类型和值类型,默认情况下,C#中的参数总是通过值传递。唯一的区别是对于引用类型,参数值引用 - 而不是对象本身。

有关详细信息,请参阅我的article on parameter passing

请注意,堆栈上的实际行为是implementation detail:C#编译器必须确保程序的行为与规范中的定义相同,但不强制执行堆栈或堆行为。因此,x 必须在代码末尾具有值1,但有效的C#编译器可以同时放置x和堆上y

答案 1 :(得分:4)

您理解正确 - x的值将放在main函数的堆栈帧中的堆栈中,y的值将放在堆栈中Foo的堆栈框架。

答案 2 :(得分:1)

有关更多详细信息,您还需要了解如何传递值参数。 Foo中的y不影响Main中的x的原因是它们处于不同的堆栈帧中。有关传递值​​类型参数的更多详细信息,请HERE