2011-07-09 60 views
4

這是一般性的程序設計疑問,而不是特定的問題。但我會用一個例子來說明。假設我正在創建一個我自己的MessageBox類,並且我希望.Show()方法可以通過說21重載來實現。我可以這樣做,如下所示。有沒有更容易的方法來創建C#中的方法的重載?

public static void Show(string x){} 
public static void Show(int x){} 
public static void Show(param x){} 
public static void Show(param2 x){} 
public static void Show(string x, param y){} 
. 
. 
. 
. 
public static void Show(param x, param y){} 

寫21這樣的方法變得相當麻煩。有沒有更簡單的方法來做到這一點?喜歡的東西,

public static void Show(string x, string y, int i, param p, ...... param21st z) 
{ 
    if (//see the arguments and decide) 
     //do stuff ignoring rest of the arguments; 
    else if (//passed arguments are of these type) 
     //then do this stuff. 
    else if (so and so) 
     // so and so. 
} 

注:1。 我知道有能像那豈不是讓我的單功能如此之大,它可以超過分開寫21種不同功能的尺寸參數。在我的情況下,單獨編寫是一個更大的麻煩,考慮我需要在該函數下執行的操作非常簡單(只是該函數可能需要大量參數)。而且這個問題也是要了解不同的編碼技術。 2.我瞭解我尋找的簡潔風格在我的情況下有它的缺點,它是我爲自己創造的一個愛好程序。所以對可用性無關緊要。只是我需要執行.Show()方法,並且每個參數組合都可以通過。 (這使得編寫單獨的函數非常繁瑣)。

謝謝。

+1

這是做到這一點的方法。如果你看看.NET的源代碼,微軟對他們的大部分API都做同樣的事情。將大量參數傳遞給單一方法是一個糟糕的主意。因爲很難弄清楚成功執行方法實際需要什麼,這是一般的維護噩夢。您可以創建一組對象來充當參數構建器(對於缺少更好的術語),以適用於傳遞不同值的不同情況。 –

+0

@Sergey Akopov是的,我完全理解這一點。感謝那。就我而言,它是爲我自己創造的一個愛好程序。所以對可用性無關緊要。我對實施更感興趣。我不明白你的評論的第二部分。可能是我應該看代碼.. – nawfal

+0

可用性在您爲愛好程序編寫的代碼中仍然很重要 - 如果您在幾個月或幾年後回到代碼中,該怎麼辦? –

回答

4

我看到的兩個很好的選擇是:1.可選參數和2.根據需要調用對方。兩者都會大大減少您需要編寫的代碼量。

以下是optional parameters(VS 2010或更高版本)的示例。在string x = "",""x的默認值。缺省值必須是編譯時常量。

public static void Show(string x = "", string y = null, int i = 0, param p = null, ...... param21st z = null) 
{ 
    if (//see the arguments and decide) 
     //do stuff ignoring rest of the arguments; 
    else if (//passed arguments are of these type) 
     //then do this stuff. 
    else if (so and so) 
     // so and so. 
} 

當你調用它,如果你不包括所有的參數,你可能會因此很明顯的編譯器,你是什麼,沒有指定需要給它們命名:

CustomMessageBox.Show(x: "hi", y: "there", p: myObject); 

這實際上只是一個編譯器技巧,可以用默認值自動填充所有未包含的參數。

另一種選擇是讓方法儘可能地相互調用。這樣你就不會重複21次代碼,只是有很多不同的方式可以運行。

public static void Show(string x){Show(x, null);} 
public static void Show(int x){//do something} 
public static void Show(param x){Show(string.Empty, x);} 
public static void Show(param2 x){//do something} 
public static void Show(string x, param y){//do something} 

做這種方式的好處是,你可以傳遞的事情除了常量,如物體或靜態只讀事情的新實例。

+0

了不起的東西!我不介意標記這個答案。讓我試試這個。真棒一塊邏輯兄弟.. – nawfal

+0

他們在VS2010中是新的?我確定我以前使用過它們,除非我正在考慮使用不同的編程語言(VB6?D :) –

+0

可選參數是一個真正的寶石。如果你沒有注意到它的優點,你甚至可以傳遞參數,而不必指定哪一個參數,就像我們平常所做的那樣,只要訂單保持不變。像這樣,在你的例如'CustomMessageBox.Show(「hi」,「there」);'或'CustomMessageBox.Show(「hi」,「there」,p16:myObject);'...不需要指定所有東西 – nawfal

5

你可以這樣做,但你必須知道函數中參數的類型。

public static void Show(params object[] values) 
{ 
    if(values[0] == "something") 
    //Do stuff 
} 
+0

我在審覈。 – nawfal

+0

@Magnus,你不必知道類型。你可以使用'GetType()'找到它們。 – svick

+0

@svick當然,我的意思是,你需要期望一定的價值,並在特定的索引類型能夠做功能的邏輯。 – Magnus

相關問題