簡體   English   中英

為什么 out 參數不能有默認值?

[英]Why can't an out parameter have a default value?

當前,當嘗試在采用 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參數分配默認值?

默認值可用於按值傳遞的參數。 該參數仍傳遞給函數,但如果代碼省略了參數,則編譯器提供缺失值。

您提出的功能完全不同。 您建議允許函數的實現者省略設置值,而不是調用者省略傳遞值。 所以,這是一個完全不同的功能。 為什么沒有實施? 以下是一些可能的原因:

  1. 沒人想過要實現這個功能。
  2. 設計人員考慮了這個功能並拒絕了它,因為它沒有足夠的實用價值。
  3. 設計人員考慮了這個特性,並將其視為混亂,因為它使用與默認值參數類似的語法,但具有完全不同的含義。

我很欣賞這並不完全回答原始問題,但我無法對評論作出貢獻。 我自己也有同樣的問題所以發現自己在這里。

由於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值,還定義它的默認值,但編譯器不允許它。

即使它允許您提供類似的默認值,它仍然需要您為所有返回的參數賦值。 因此,您的默認值將被覆蓋。

方法參數上的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
}

默認參數值是用於傳遞給該方法的參數的缺省值。 您必須指定一個變量以傳遞out參數,以便您可以獲取返回的值。

在某種程度上,您的第一個示例在方法的開頭設置了默認值。

如果您對使用 'out' 或 'ref' 的方法有兩次調用,並且您想避免將該方法一分為二,如果其中一個調用未使用這些參數,則是一種避免警告的優雅解決方案“未使用該值”(或類似內容)的編譯器將使用以下內容:

方法(“嗨”,出_);

用“out”聲明的方法參數不能由調用者分配其值。 因此在調用期間也不能分配默認值。

此外,在使用參數或從方法返回之前,您必須始終在方法主體中初始化“out”參數。 這將覆蓋任何默認值。

這就是“out”修飾符的全部意義所在。 如果您想要不同的行為,請檢查“ref”和“in”修飾符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM