【问题标题】:C# Out parameter question: How does Out handle value types?C# Out 参数问题:Out 如何处理值类型?
【发布时间】:2010-10-01 00:11:19
【问题描述】:

更新所以完全拉了一个工具的时刻。我真正的意思是参考与输出/参考。任何说“参考”的东西,我真正的意思是参考,如

SomeMethod(对象 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
}

对对象来说这很好,但值类型怎么办?

【问题讨论】:

    标签: c# stack heap-memory out-parameters


    【解决方案1】:

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

    RefMethod(SomeThing **inner)
    {
    }
    

    在 C++ 中,如果是值类型,则为

    RefMethod2(int *inner)
    {
    }
    

    对于值类型。

    【讨论】:

    • 在我看来,更清楚地说 ref 创建了一个指向 variable 的指针(其值确实是对对象的引用)。不过只是 MHO。
    【解决方案2】:

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

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

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

    请参阅my article on parameter passing,了解有关 ref/out 的更多详细信息。

    【讨论】:

      【解决方案3】:

      ref 和 out 是完全一样的,据我所知,除了不能初始化 out 参数。因此两者都进入堆栈。

      【讨论】:

      • 我认为您的意思是在方法内正常返回之前必须明确分配一个输出参数必须;用作 out 参数的变量不必在调用之前明确分配,尽管可以。 (会在之后。)
      • 要补充 Jon 所说的,必须初始化一个 ref 参数,而 out 参数不一定是(但可以)。
      • @JonB:你的意思是这两个方面的“争论”。在这种特殊情况下的重要区别:) (参数在调用方;参数在被调用方指定。)
      • 是的,我问错了。我的意思是如何在 ref/out 中处理值类型与通过引用进行处理。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2010-11-17
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多