2012-09-24 69 views
0

我有一個可選參數的這種方法。私有方法參數

public static Test(String connection, Int32 retryInfiniteLoopGuard = 0) 

有沒有辦法以某種方式紀念retryInfiniteLoopGuardprivate,這樣它會調用從類以外的方法時成爲無形?

如果你想知道爲什麼,retryInfiniteLoopGuard是遞歸執行,應該是不可見的用戶...

今天我超載使用,但有沒有其他辦法?

+3

出於純粹病態的好奇心 - 你爲什麼要另一種方式? –

+0

由於與在C#4.0中引入可選參數相同的原因...我只想更深入一步並隱藏可選參數 – user1662812

+3

C#4.0中的可選參數值是通過在調用點處注入這些值來編譯的。即即使你的代碼是Test(連接),編譯器實際上也會產生一個像Test(connection,0)這樣的調用。所以,如果不使用重載,就沒有辦法達到你想要的行爲。 –

回答

15

使用該參數創建該方法的私有重載並從公共版本中刪除該參數。比讓公衆版本撥打默認值的私人版本:

private static int Test(string connection, int retryInfiniteLoopGuard) 
{ 
    // The code 
} 

public static int Test(String connection) 
{ 
    return Test(connection, 0); 
} 

沒有其他方法可以實現該目標。

+1

你真的認爲我不知道重載嗎? – user1662812

+4

@ user1662812:確實,在你編輯你的問題之前,它看起來像這樣。 –

+4

@ user1662812你會很驚訝我們必須承擔或不承擔有關這裏提出的問題。我們必須 - 並且*應該* - 保持非常開放的態度。 –

1

不知道爲什麼你會需要它,但你可以創建兩個方法,這樣

public static Test(String connection, Int32 retryInfiniteLoopGuard) 
{ 
    //method body 
} 

public static Test(String connection) 
{ 
    Test(connection, 0); 
} 
+5

不是他們想要的東西 - 帶額外'int'的重載應該是私有的。 –

+0

所以你真的認爲我不知道重載? – user1662812

+0

重載清楚地解決了你的問題。無論你是第一種私人還是公開的方式,都是你的決定。所以,問題解決了。 –

3

在新的C#6你能做到以下幾點:

public static int Test(String connection, private Int32 retryInfintiteLoopGuard = 0) 
{ 
    /* Enter Code Here */ 
} 

它編譯爲:

private static int test(String connection, Int32 retryInfiniteLoopGuard) 
{ 
    /* Enter Code Here */ 
} 
public static int Test(String connection) 
{ 
    return test(connection, 0); 
} 

這種方式的工作方式是所有的參數隱式地可訪問的方法,除非cou rse另有明確規定。 支持的訪問器:

public 
internal 
protected 
private 
+0

你如何爲你做這項工作?我的目標是.NET Framework 4.6.1(現在是最新版本),並使用VS2017,但這不適用於我。 – Jeppe

+0

我不認爲這是在C#6中發佈的。 –