您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

返回值或out参数哪个更好?

返回值或out参数哪个更好?

方法没有其他要返回的值时,返回值几乎 总是 正确的选择。(事实上,我不能想到这里我想任何情况下, 曾经 想要一个空白方法out参数,如果我当初的选择。C#7的Deconstruct方法语言支持的解构作为一个非常,非常罕见的例外)

除了其他方面,它使调用者不必单独声明变量:

int foo;
GetValue(out foo);

int foo = GetValue();

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

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

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

另外,out参数在反射时更难使用,通常也使测试更加困难。(通常要花更多的精力来简化返回值的模拟,而不是out参数)。基本上没有什么可以让他们 更容易

返回值FTW。

编辑:就发生了什么…

基本上,当您为“ out”参数传递参数时, 必须 传递一个变量。(数组元素也被分类为变量。)您调用方法在其堆栈上没有用于参数的“新”变量- 它使用您的变量进行存储。变量中的任何更改都将立即可见。这是一个显示差异的示例:

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

区别在于“发布”步骤- 即更改了局部变量或参数之后。在ReturnValue测试中,这与静态value变量没有区别。在OutParameter测试中,value变量由以下行更改tmp = 10;

其他 2022/1/1 18:14:37 有518人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶