在指针参数上使用ref和out关键字

时间:2013-11-25 15:43:44

标签: c# pointers out ref

我正在学习C和C#,这个问题适用于C#。你为什么要在指针上使用out和ref关键字?使用指针,您可以直接访问变量。我在msdn上发现了这段代码:here

以下是代码:

static int value = 20;
public unsafe static void F(out int* pi1, ref int* pi2)
{
  int i = 10;
  pi1 = &i;
  fixed (int* pj = &value)
  {
     // ...
     pi2 = pj;
  }
}

3 个答案:

答案 0 :(得分:9)

  

为什么你会在指针上使用out和ref关键字?

那么,为什么你会使用out和ref关键字,句号?当您希望调用修改现有变量的方法时,可以使用out关键字。当您希望调用读取和修改现有变量的方法时,可以使用ref关键字。变量是指针类型似乎不是特别相关。

如果您的问题实际上是“你可以给我一个实际代码的例子,你可能希望通过ref传递指针类型的变量吗?”那么我必须承认,在编写C#代码的十年中,我从未在生产代码中使用过指针而且很少使用ref,所以我没有个人经验的例子。我可以想象这样的事情。例如,想象一下传统的C风格双向链表。您可能希望同时读取和改变列表的头部和尾部指针,并将ref Link*传递到头部和尾部。

现在您已经包含了指向您找到此代码的位置的链接,我注意到它明确表示这是一个危险的代码示例,您必须永远不要写。因此,在什么情况下要求编写这样的代码是不可能的。我现在真的不明白你的问题,我看到了代码的起源;你应该从不写这样的代码;这是样本的整个

答案 1 :(得分:1)

  

为什么你会在指针上使用out和ref关键字?

如果要提供指向函数调用者的指针,在out的情况下,或者当您希望获得指针并可选择修改它以指向不同的东西时,在ref

如果您不需要改变指针,而只需要取消引用指针以查看它指向的内容,那么您可以按值传递指针,而不是通过引用,这是不使用outref时的行为。

答案 2 :(得分:0)

我从未在C#中使用过指针,但我确实使用了引用类型的ref参数。理由:明确的意图。如果我看到一个带有 ref 参数的方法,我知道这个参数会被改变,所以没有惊喜。