2011-05-10 86 views
1

我似乎回想起C#4.0中方法重載(和構造函數鏈)與可選參數之間存在重要區別,但是我一直無法找到任何證實任何區別的東西。方法重載與可選參數

以下兩種實現有什麼重要區別嗎?

首先

public void Foo() 
{ 
   Foo(String.Empty); 
} 

public void Foo(string message) 
{ 
   Console.WriteLine(message); 
}

public void Foo(string message = "") 
{ 
   Console.WriteLine(message); 
}
+1

我對C#並不是很熟悉,但是當你想擁有不同類型的參數時,通常會使用方法重載。使用可選參數,它們只能是特定的類型。 – 2011-05-10 15:05:09

回答

8

我希望方法重載。有可選參數known versioning問題。

有一篇很好的文章,由Jon Skeethere

動機增加,這是使其更容易跟COM其中的方法可以有很多很多參數和C#類較少論壇新設計實踐

+0

+1,我沒有想過這個。好點子! – FrustratedWithFormsDesigner 2011-05-10 15:05:16

+0

這正是我所期待的。非常感謝你。 – senfo 2011-05-10 15:19:27

+0

「已知版本問題」實際上不是問題,也不是反對使用可選參數的論據。只有在下一個版本中修改方法時,它們纔會成爲問題。但是這可以通過添加一個重載而不是一個可選參數來輕鬆解決。問題解決了(是的,菲爾說另外一些,但他犯了一個錯誤,因爲他提出了新的論點可選)。 – 2011-05-10 15:21:10

1

我會去的第二個選項。您可以將默認字符串更改爲某個常數,那麼在以後的日子,你可以改變常量的值,如:

constant String defaultString = String.Empty; //change this later if the default value needs to be something else, can't remember if the syntax is valid C# ;) 
//... 
public void Foo(string message = defaultString) 
{ 
    Console.WriteLine(message); 
} 

而且,你少了一個(雖然簡單)的功能來維持。

+0

我不記得任何有關方法重載和可選參數之間的功能差異的任何說法 - 所以我會默認選擇參數來維護代碼 - 只有在某些情況要求我使用重載時才使用重載。 – AllenG 2011-05-10 15:06:10

+0

「'k_dflt_str'」 - 什麼?!否否否否否否。 – 2011-05-10 15:07:53

+0

@Konrad Rudolph:他的大腦目前處於我們的PL/SQL標準模式。 ;) – FrustratedWithFormsDesigner 2011-05-10 15:09:23

0

可選參數是語法糖。

除了向前兼容以前版本的.NET,它們都是一樣的。

+0

他們的IL是不同的。讓我覺得他們在JIT之後依然不同。向後兼容性也是有問題的。由於可選參數在.Net 4之前的IL支持。 – 2011-05-10 15:35:46

3

可選參數像常量一樣工作,並在編譯時被替換。

public void Foo(string s = "default") 
Foo(); 

將生成代碼的調用者:

public void Foo(string s) 
Foo("default"); 

這意味着所有的組件引用您將有舊的默認如果您選擇更改默認的新版本!

重載不像常量一樣行爲,並將默認值隱藏在程序集中。這提供了一個乾淨的升級路徑。