2011-01-19 135 views
27

我們假設我有一個out參數的函數,但是我不需要它的值。有沒有辦法傳遞任何實際參數,如果給定的結果將被扔掉呢?有沒有辦法省略掉參數?

編輯:

雖然問題已投成的Optional Output Parameters 欺騙它只是,如果你從方法創建者的角度去看待。如果您是該方法的用戶,則您不希望使參數成爲可選參數,只是在未聲明變量的情況下不使用它。雖然這是不可能的,但C# 7.0可以在方法調用中聲明它。因此,而不是:

int unusedValue; 
TryGetValue("key", out unusedValue); 

你:

TryGetValue("key", out int unusedValue); 

甚至:

TryGetValue("key", out _); 

這應該作爲一個答案,但:

  • 我可以」不要爲這個問題做這件事,因爲它被標記爲一個笨蛋;
  • 這個問題的問題似乎是一個事實上要求不同的事情。
+5

否否否否否否 – Andrey 2011-01-19 20:16:10

回答

22

你不能這樣做,但沒有規則說你必須使用返回的值。你可以簡單地傳遞一個你永遠不會再使用的臨時變量。

C#4.0允許可選參數,但out參數不能是可選的。

編輯: BTW,你也可以重載方法:

int DoStuff() 
{ 
    int temp; 
    return DoStuff(out temp); 
} 

int DoStuff(out outParam) 
{ 
    //... 
} 
+0

嗯,我知道我不必使用它。我也不想傳遞任何變量。然而,這是答案,謝謝。 – 2011-01-19 20:23:26

7

雖然你不能真正使輸出參數可選的,你可以簡單地創建功能的過載而沒有輸出參數,這會消除創建臨時變量的需要。

public void DoSomething(int param1, out int param2) 
{ 
    /* Method work here */ 
} 

public void DoSomething(int param1) 
{ 
    int temp; 
    DoSomething(param1, out temp); 
} 
+0

這個答案更實用。如果您想使用它或不再使用它,則無需稍後修改。 – elcool 2011-01-19 20:42:47

+0

如果你不擁有你所調用的方法,你可以創建一個擴展方法來虛擬出你的輸出參數。 – 2017-03-02 23:04:40

0

不確定C#,但在VB.Net中,您可以簡單地將常量傳遞給輸出(byref)參數。所以如果你有一個整數,作爲一個輸出參數,你不必傳入一個實際的變量,你可以傳入0或任何其他有效的整數。對於包括字符串在內的對象,您可以僅傳入Nothing(C#中爲空),並且一切正常。我不確定變量存儲在哪裏,可能就像在你傳入的任何其他參數中那樣在堆棧中,並且當函數退出時它會消失。

相關問題