首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >返回值和输出参数,哪个更好?

返回值和输出参数,哪个更好?
EN

Stack Overflow用户
提问于 2009-05-01 09:37:26
回答 3查看 135.1K关注 0票数 161

如果我们想要从一个方法中获得一个值,我们可以使用任何一个返回值,如下所示:

public int GetValue();

或者:

public void GetValue(out int x);

我真的不明白它们之间的区别,所以,我不知道哪一个更好。你能给我解释一下吗?

谢谢你。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-05-01 09:42:15

返回值几乎是始终当方法没有任何其他东西可返回时,这是正确的选择。(事实上,我想不出任何情况下我会永远不会我想要一个带有out参数,如果我可以选择的话。C# 7Deconstruct语言支持的解构方法是这条规则的一个非常非常罕见的例外。)

抛开其他事情不谈,它使调用者不必单独声明变量:

int foo;
GetValue(out foo);

vs

int foo = GetValue();

Out值还可以防止方法链接,如下所示:

Console.WriteLine(GetValue().ToString("g"));

(实际上,这也是属性设置器的问题之一,这也是为什么构建器模式使用返回构建器的方法,例如myStringBuilder.Append(xxx).Append(yyy)。)

此外,输出参数与反射一起使用会稍微困难一些,而且通常也会使测试变得更加困难。(通常要花更多的精力来使模拟返回值比模拟输出参数更容易)。基本上我想不出他们做了什么

更简单..。

返回值FTW。

编辑:关于正在发生的事情...

基本上,当您传入"out“参数的实参时,

有传入一个变量。(数组元素也被归类为变量。)您调用的方法在其堆栈中没有用于参数的"new“变量-它使用您的变量进行存储。变量中的任何更改都会立即可见。下面的例子展示了其中的不同之处:

using System;

class Test
{
    static int value;

    static void ShowValue(string description)
    {
        Console.WriteLine(description + value);
    }

    static void Main()
    {
        Console.WriteLine("Return value test...");
        value = 5;
        value = ReturnValue();
        ShowValue("Value after ReturnValue(): ");

        value = 5;
        Console.WriteLine("Out parameter test...");
        OutParameter(out value);
        ShowValue("Value after OutParameter(): ");
    }

    static int ReturnValue()
    {
        ShowValue("ReturnValue (pre): ");
        int tmp = 10;
        ShowValue("ReturnValue (post): ");
        return tmp;
    }

    static void OutParameter(out int tmp)
    {
        ShowValue("OutParameter (pre): ");
        tmp = 10;
        ShowValue("OutParameter (post): ");
    }
}

结果:

Return value test...
ReturnValue (pre): 5
ReturnValue (post): 5
Value after ReturnValue(): 10
Out parameter test...
OutParameter (pre): 5
OutParameter (post): 10
Value after OutParameter(): 10

不同之处在于"post“步骤--即在局部变量或参数被改变之后。在ReturnValue测试中,这对静态value变量。在OutParameter测试中,

value变量按行更改tmp = 10;

票数 164
EN

Stack Overflow用户

发布于 2009-05-01 09:41:01

哪个更好,取决于你的具体情况。

一个原因out exists是为了便于从一个方法调用中返回多个值:

public int ReturnMultiple(int input, out int output1, out int output2)
{
    output1 = input + 1;
    output2 = input + 2;

    return input;
}

因此,从定义上讲,一种并不比另一种更好。但是通常你会想要使用一个简单的返回,除非你有上面的例子。

编辑:这是一个示例,演示了关键字存在的原因之一。以上绝不是最好的做法。

票数 27
EN

Stack Overflow用户

发布于 2009-05-01 09:42:41

通常情况下,您应该更喜欢返回值而不是out参数。如果你发现自己编写的代码需要做两件事,那么Out params是一个必要的缺点。Try模式就是一个很好的例子(比如Int32.TryParse)。

让我们考虑一下这两个方法的调用者必须做什么。对于第一个示例,我可以这样写:

int foo = GetValue();

注意,我可以声明一个变量,并在一行中通过你的方法赋值它。FOr第二个例子看起来是这样的.

int foo;
GetValue(out foo);

我现在不得不提前声明我的变量,并用两行代码来编写我的代码。

更新

在提出这些类型的问题时,.NET框架设计指南是一个很好的参考。如果你有书的版本,那么你可以看到Anders Hejlsberg和其他人关于这个主题的注释(第184-185页),但在线版本在这里……

http://msdn.microsoft.com/en-us/library/ms182131(VS.80).aspx

如果您发现自己需要从API返回两个内容,那么将它们包装在一个struct/class中会比一个out param更好。

票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/810797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档