关于c#:在指针参数上使用ref和out关键字

Use the ref and out keyword on a pointer parameter

我在学习C和C,这个问题是C的。为什么要在指针上使用out和ref关键字?通过指针,您可以直接访问变量。我在这里的msdn上找到了这个代码。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
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;
  }
}


Why would you ever use the out and ref keywords on pointers?

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

如果您的问题实际上是"您能给我一个现实代码的例子吗?在这个例子中,您可能希望通过引用传递一个指针类型的变量?"然后我必须承认,在编写C代码的十年中,我从未在生产代码中使用指针,很少使用ref,所以我没有个人经验的例子。但我可以想象这样的事情。例如,想象一个传统的C样式的双重链接列表。在这种情况下,您可能希望同时读取和改变列表的头和尾指针,并通过将ref Link*传递给头和尾来实现这一点。

既然您已经包含了找到此代码的链接,那么我注意到它明确地表示这是一个危险的、被破坏的代码示例,您永远不能编写它。因此,询问在什么情况下您希望编写这样的代码是不可能的。既然我看到了代码的起源,我真的不理解您的问题的要点;您不应该这样编写代码;这就是示例的全部要点。


Why would you ever use the out and ref keywords on pointers?

当您想向函数的调用者提供一个指针时,在out的情况下,或者当您想得到一个指针并有选择地修改它以指向不同的对象时,在ref的情况下。

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


我从来没有在C_中使用指针,但我确实在引用类型中使用了ref参数。理由:目的明确。如果我看到一个方法接受一个引用参数,我知道这个参数会发生变化,所以不会有什么意外。