C#Out参数问题:Out如何处理值类型?

时间:2009-01-12 19:50:48

标签: c# stack heap out-parameters

更新所以完全拉了一个工具时刻。我的意思是参考与Out / Ref。任何说'参考'的东西我​​的意思都是参考

SomeMethod(Object someObject)

对战

SomeMethod(out someObject)

抱歉。只是不想更改代码,所以答案已经有意义了。

据我了解,与ref不同的是,它“复制”指针并在堆栈上创建一个新空间以使用该指针,但不会更改指针:

SomeMethod()
{
 SomeThing outer = new SomeThing();
 RefMethod(ref outer)
}

RefMethod(ref inner)  //new space on stack created and uses same pointer as outer
{
   inner.Hi = "There"; //updated the object being pointed to by outer
   inner = new SomeThing();//Given a new pointer, no longer shares pointer with outer
                           //New object on the heap
}

Out复制指针并可以操作它指向的位置:

SomeMethod()
{
 SomeThing outer = new SomeThing();
 RefMethod(out outer)
}

RefMethod(out inner)  //same pointer shared
{

   inner = new SomeThing();//pointer now points to new place on heap  
                           //outer now points to new object
                           //Old object is orphaned if nothing else points to it
}

对于对象来说这很好用,但是值类型怎么看,因为它们没有任何东西指向只在堆栈上?

3 个答案:

答案 0 :(得分:9)

仅仅因为变量存在于堆栈上(如果它是局部变量)并不意味着你不能创建指向它的指针 - 实际上也是引用类型的情况。

RefMethod中的指针是“外部”变量 - 变量本身就存在于堆栈中,因为它是一个未捕获的局部变量。

正如Leppie所说,ref和out是相同的,除了明确赋值的规则 - 实际上,IL的唯一区别是应用于out参数的属性。

有关参考/退出的详细信息,请参阅my article on parameter passing

答案 1 :(得分:3)

据我所知,

ref和out完全相同,但out参数无法初始化。因此两者都在堆栈上。

答案 2 :(得分:1)

实际上在引用类型上使用ref或out也会创建一个指针...不是指向对象而是指向对象的引用! 所以它会是某种

RefMethod(SomeThing **inner)
{
}

在C ++中,而值类型则是

RefMethod2(int *inner)
{
}

表示值类型。