c#按值传递

ash*_*010 3 c#

嗨,大家只是想知道采取以下的例子

public void main()
{

   int x = 1;

   Foo(x);
}

public void Foo(int y)
{
    y = 5;
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Jon*_*eet 14

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

实际上,对于引用类型和值类型,参数始终在C#中默认传递值.唯一的区别是对于引用类型,参数值引用 - 而不是对象本身.

有关详细信息,请参阅我关于参数传递的文章.

请注意,堆栈上的实际行为是一个实现细节:C#编译器必须确保程序的行为与规范中的定义相同,但不强制执行堆栈或堆行为.所以x 确实必须有在你的代码的最后1的值,而是一个有效的C#编译器可能已经把两者xy在堆上.

  • @ ash2010:C#编译器没有内联任何东西.JIT编译器执行内联,在CLR v4中,它会告诉您何时决定进行内联!http://blogs.msdn.com/b/clrcodegeneration/archive/2009/05/11/jit-etw-tracing-in-net-framework-4.aspx (2认同)