【问题标题】:C# out parameters vs returnsC#输出参数与返回
【发布时间】:2012-06-28 02:11:19
【问题描述】:

所以我是 C# 新手,我很难理解 out。而不是仅仅从函数中返回一些东西

using System;
class ReturnTest
{
    static double CalculateArea()
    {
         double r=5;
         double area = r * r * Math.PI;
         return area;
    }

    static void Main()
    {
         double output = CalculateArea();
         Console.WriteLine("The area is {0:0.00}", output);
    } 
 }

对比一下

 using System;
 class ReturnTest
 {
     static void CalculateArea(out double r)
     {
         r=5;
         r= r * r * Math.PI;
     }

     static void Main()
     {
         double radius;
         CalculateArea(out radius);
         Console.WriteLine("The area is {0:0.00}",radius );
         Console.ReadLine();
     }
}

第一个是我通常会怎么做。我是否有理由想使用out 而不仅仅是返回语句?我了解ref 允许双向通信,并且我通常不应该使用ref,除非该函数正在对我发送的变量执行某些操作。

但是,out 和 return 语句之间有区别吗,如上所示?在语法方面是否有理由偏爱其中一个?

【问题讨论】:

  • 研究Dictionary.TryGetValueint.TryParse,看看这些例子是否能解释out的实用性。
  • out 主要用于需要从方法返回多个不相关的值时。同样,它通常用于在通过 COM 或 p/invoke 与本机代码互操作时模拟指针。
  • 请记住,在 C/C++ 中我们有指针。当您将指针传递给函数时,您可以在函数内对其进行修改,并且调用函数中的值也会发生变化。 out 做几乎相同的事情。
  • @carny666:我认为refout 更类似于C++ 引用。
  • @KirkWoll 这是两个很好的例子,谢谢!

标签: c# reference return out


【解决方案1】:

使用out 代替return 的一个很好的用途是您可以在某些API 中看到Try 模式,例如Int32.TryParse(...)。在此模式中,返回值用于表示操作成功或失败(而不是异常),out 参数用于返回实际结果。

相对于Int32.Parse 的优点之一是速度,因为可以避免异常。在另一个问题中提出了一些基准:Parsing Performance (If, TryParse, Try-Catch)

【讨论】:

    【解决方案2】:

    out 关键字主要用于当您希望从一个方法返回多个值,而不必将这些值包装在一个对象中时。

    一个例子是Int32.TryParse 方法,它有一个返回值(一个表示尝试成功的布尔值)和一个out 参数,如果解析成功则获取该值。

    该方法可以返回一个同时包含布尔值和整数的对象,但这需要在堆上创建对象,从而降低了该方法的性能。

    【讨论】:

    • 我也想知道性能差异(如果有的话)。来自 c++ 环境的论点是,在按值返回时复制对象的成本更高。 C# 也是如此吗?我的意思是,如果你在函数中构造一个全新的大型对象并返回它,它会被复制到你分配的任何东西吗?与创建对象并通过 out 关键字更改它相反?还是这在 C# 中无关紧要?
    • @Reasurria:如果你创建一个对象并返回它,它只是返回的引用,对象不会被克隆。在 .NET 中,仅当您专门克隆对象时才会克隆对象,传递对象不会创建新副本。
    【解决方案3】:

    我倾向于使用out 的唯一时间是当我需要从一个方法返回多个东西时。 Out 让您避免将多个对象包装到一个类中以进行返回。查看Microsoft Out page 的示例。

    【讨论】:

    • 请注意,在最新版本的 C# 中,您现在可以使用值元组执行此操作。例如(字符串名称,整数年龄)GetMultipleValues() { return ("james", 31); }
    【解决方案4】:

    你可以有多个输出参数,所以如果你需要返回多个值,这比为你的返回值创建一个特殊的类要容易一些。

    【讨论】:

      【解决方案5】:

      当关注一个变量时,返回即可。但是如果你想返回超过 1 个值怎么办? Out 对此有所帮助。

      static void CalculateArea(out double r, out double Foo)
      {
          //Can return 2 values in terms of out variables.
      }
      
      static double CalculateArea(double r)
      {
           // Will return only one value.
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-27
        • 1970-01-01
        • 2021-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-10
        • 1970-01-01
        相关资源
        最近更新 更多