为什么out参数有默认值?

时间:2014-05-29 12:33:40

标签: c# default-value out

目前,当尝试在采用out参数的方法中执行某些操作时,我需要在方法体中指定out参数的值,例如

public static void TryDoSomething(int value, out bool itWorkerd)
{
    itWorkerd = true;

    if (someFavourableCondition)
    {
        // if I didn't assign itWorked variable before this point, 
        // I get an error: "Parameter itWorked must be assigned upon exit.
        return;
    }

    // try to do thing

    itWorkerd = // success of attempt to do thing
}

我希望能够设置itWorked参数的默认值,因此我不必随意设置方法正文中的值。

public static void TryDoSomething(int value, out bool itWorkerd = true)
{
    if (someFavourableCondition)
    {
        // itWorked was already assigned with a default value
        // so no compile errors.
        return;
    }

    // try to do thing

    itWorkerd = // success of attempt to do thing
}

为什么无法为out参数指定默认值?

5 个答案:

答案 0 :(得分:4)

默认值可用于按值传递的参数。该参数仍传递给函数,但如果代码省略了参数,则编译器提供缺失值。

您建议的功能完全不同。您建议允许函数的实现者省略设置值,而不是调用者省略传递值。所以,这是一个完全不同的功能。为什么没有实施?以下是一些可能的原因:

  1. 没人想过要实现这个功能。
  2. 设计师考虑了这个功能并拒绝了它,因为它不值得花费实施成本。
  3. 设计师考虑了这个功能并拒绝它,因为它使用与默认值参数类似的语法,但具有完全不同的含义。

答案 1 :(得分:2)

我很欣赏这并不能完全回答原来的问题,但我无法为评论做出贡献。我自己也有同样的问题,所以在这里找到了自己。

由于C#7现在允许参数在调用范围内有效地成为变量声明,因此分配默认值会很有用。

考虑以下简单方法:

private void ResolveStatusName(string statusName, out string statusCode)
    {
        statusCode = "";
        if (statusName != "Any")
        {
            statusCode = statusName.Length > 1
                ? statusName.Substring(0, 1)
                : statusName;
        }
    }

直接修改它是这样的:

 private void ResolveStatusName(string statusName, out string statusCode = "")
    {
        if (statusName != "Any")
        {
            statusCode = statusName.Length > 1
                ? statusName.Substring(0, 1)
                : statusName;
        }
    }

目的是不仅要声明statusCode值,还要定义它的默认值,但编译器不允许它。

答案 2 :(得分:0)

即使它允许你给出这样的默认值,它仍然需要你为所有返回的参数赋值。因此,您的默认值将被覆盖。

答案 3 :(得分:0)

方法参数上的out方法参数关键字使方法引用传递给方法的同一变量。当控制传递回调用方法时,对方法中的参数所做的任何更改都将反映在该变量中。 当您希望方法返回多个值时,声明out方法很有用。使用out参数的方法仍然可以返回值。一个方法可以有多个out参数。 要使用out参数,必须将参数显式作为out参数传递给方法。 out参数的值不会传递给out参数。 作为out参数传递的变量无需初始化。但是,必须在方法返回之前为out参数指定一个值。

编译器不允许您将参数用作默认参数,因为它违反了其用例。如果你没有将它传递给函数,你就不能在调用函数时使用它的值。

如果您可以调用TryDoSomething(123)以下的功能,那么就不会使用out参数,因为您将无法使用itWorked的值

public static void TryDoSomething(int value, out bool itWorkerd = true)
{
    if (someFavourableCondition)
    {
        // itWorked was already assigned with a default value
        // so no compile errors.
        return;
    }

    // try to do thing

    itWorkerd = // success of attempt to do thing
}

答案 4 :(得分:0)

默认参数值是中传递给方法的参数的默认值。您必须指定一个变量以传递 out 参数,以便您可以获取返回的值。

在某种程度上,您的第一个示例在方法的开头设置了默认值。

相关问题