嗨,大家好奇怪想看下面的例子
public void main()
{
int x = 1;
Foo(x);
}
public void Foo(int y)
{
y = 5;
}
我们知道C#参数是按值类型的值传递的。这是否意味着在上面的例子中我在堆栈上有2个副本,一个用于x,一个用于y ??
由于
答案 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。