【问题标题】:Use the ref and out keyword on a pointer parameter在指针参数上使用 ref 和 out 关键字
【发布时间】:2013-12-10 10:03:21
【问题描述】:

我正在学习 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;
  }
}

【问题讨论】:

  • C 和 C# 是截然不同的语言,我建议一次只学习两种语言中的一种。您应该不在 C# 中经常使用指针,但应该在 C 中使用它们。
  • 不过,要回答您的具体问题,我认为这就像有一个指向指针的指针。
  • 您要告诉我们您在 MSDN 上的哪个位置找到了它,还是我们应该猜测?
  • 你没有读过 MSDN 上说这是一个你不应该写的代码示例吗?这是向您展示必须避免的危险破坏模式的示例代码,因此您没有理由编写这样的代码。

标签: c# pointers out ref


【解决方案1】:

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

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

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

既然您已经包含了指向您找到此代码的位置的链接,我注意到它明确指出这是一个您绝不能编写的危险破坏代码示例。因此,询问您希望在什么情况下编写这样的代码是不可能的。既然我看到了代码的起源,我真的不明白你的问题的重点;你应该永远写这样的代码;这就是样本的全部点。

【讨论】:

  • 抱歉,我是新手,只是浏览了一些网站并查看代码,这段代码给了我一个问题,因为将这些指针作为 ref 传递并在指针可以有时传递出去听起来很奇怪访问传递的变量。可能是因为一直觉得学C#的过程比较慢,不知道是我自己还是难。
  • @somethingSomething:作为新手,我的建议是不要花太多时间阅读指针;使用指针意味着放弃为语言设计的安全网。 C# 试图引导您远离使用指针(带有警告标志,如“不安全”关键字并需要 /unsafe 编译器标志)。
  • @somethingSomething:Brian 是正确的;我已经用 C# 编程十年了,从来不需要在生产代码中编写指针代码。此功能仅适用于 C# 编程中最高级的场景,因此从新手开始可能是一个非常糟糕的主意。
【解决方案2】:

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

当您想提供指向函数调用者的指针时,在out 的情况下,或者当您想获得一个指针并可以选择修改它以指向不同的东西时,在@987654322 的情况下@。

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

【讨论】:

  • 在幕后,ref 和 out 只是指针;它们是垃圾收集器知道的特殊指针,但它们只是指针。指针和refd 变量之间的区别在于 (1) GC 是否正在跟踪它们,以及 (2) C# 编译器会在 ref 或 out 的情况下自动取消引用指针代表。
【解决方案3】:

我从未在 C# 中使用过指针,但我确实将 ref 参数与引用类型一起使用。原因:意图明确。如果我看到一个带有 ref 参数的方法,我就知道这个参数会发生变异,所以这并不奇怪。

【讨论】:

    猜你喜欢
    • 2010-09-28
    • 2014-04-28
    • 2016-02-22
    • 2011-07-26
    • 2011-02-03
    • 2012-05-01
    • 2011-02-17
    • 2012-08-08
    • 1970-01-01
    相关资源
    最近更新 更多