【问题标题】:why both out & ref?为什么同时出和参考?
【发布时间】:2014-12-06 22:59:51
【问题描述】:

out 变量引用可以使用未分配变量的地址进行初始化,但 ref 变量不能这样做,这使得 out 优于 ref。那么ref有什么用呢?

【问题讨论】:

  • 正确答案是“因为它是”。这就是out的定义。
  • @Mephy 仍然有 5 个人聚集在一起提供答案。
  • @ShamseerKSmr 这是一个简单的谷歌c# out搜索。您将获得 MSDN 页面:msdn.microsoft.com/en-us/library/t3c3bfhx.aspx。在那里,您会看到以下注释:“虽然作为输出参数传递的变量在传递之前不必初始化,但调用的方法需要在方法返回之前分配一个值” 。简单!
  • 您能否澄清您的要求 - 您本质上说您知道编译器必须显示错误,因为它是在 C# 规范中指定的(基于您说您知道 refout)。那么您是否在寻找 C# 规范同时具有 refout 的历史原因?或者是其他东西? (请注意,您想要的信息可能会出现在ref vs out SO 问题中。)
  • 您不应该将初始化的变量传递给输出参数。那不是它的用途。那么为什么编译器会考虑到这一点。

标签: c# .net out ref


【解决方案1】:

正如您所说,您知道差异,因此我假设您也知道必须分配 out 参数的事实。

因此,我相信您想知道为什么需要分配 out 参数。

out 关键字 - 这意味着您正在使用此参数来输出某些内容。

考虑一下,int add(int x, inty)。如果这个方法不会返回任何东西,它应该工作。在这里,我们还声明了一个该方法返回整数的合约。同样,在 out 关键字的情况下,我们定义了一个将分配 out 变量并将作为输出提供的合同。

为什么我们需要更新? 这是因为我们明确地将其标记为输出参数,因此我们确信我们将分配一个值并返回它。如果在某些情况下我们没有任何要分配的东西并且我们仍在使用 out 参数,那么我非常确定我们遇到了设计问题。

ref 关键字: - 这意味着您正在传递引用。它绝不意味着您将分配它并提供一些输出。您可以以这种方式使用它,但它不是合同。你有一个参数的引用,你可以用它做任何事情。在 C# 中,参数默认按值传递。 ref 关键字为您提供了一种通过引用传递参数的方法。

您可以获取更多关于 ref 关键字here 的信息。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    如果您只想通过引用将参数传递给函数,您应该使用ref:

    class Program
    {
        static void Main(string[] args)
        {
            int integer = 9;
            Method(ref integer);
        }
    
        static void Method(ref int pointer)
        {
        }
    }
    

    这将正常编译。

    【讨论】:

      【解决方案3】:

      我的理解是out参数是被调用的方法设置的,而不是传入方法中的。

      所以这些都是有效的:

      class Program
      {
          static void Main(string[] args)
          {
              int integer;
              Method(out integer);
      
              // integer is now 9
          }
      
          static void Method(out int pointer)
          {
              ...
              pointer = 9;
          }
      }
      
      // Option 2:
      
      class Program
      {
          static void Main(string[] args)
          {
              int integer = 9;
              Method(integer);            
          }
      
          static void Method(int pointer)
          {            
              //Do something with pointer = 9
          }
      }
      

      【讨论】:

        【解决方案4】:

        问题是因为必须在函数结束之前初始化或分配 out 参数。基本上是这样你就不会忘记设置变量了。

        static void Method(out int pointer)
        {
            pointer = 5; //Initialize or assign to fix the error
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-15
          • 2014-04-29
          • 1970-01-01
          • 1970-01-01
          • 2020-07-18
          相关资源
          最近更新 更多