(翻譯) 為什麼C#不提供默認參數(default parameter)? (.NET) (C#) (C++/CLI) (C/C++)

Abstract
這是我長久的疑問,也是多年以來C#被罵到臭頭之處,因為C++、VB6、VB.NET,就連T-SQL都有default value,為什麼C#沒有呢?我翻譯了Eric Gunnerson的博客,Eric是C# team的重要成員,我想某種程度可以解釋為什麼C#到了2.0還是不願意提供default value的原因。

原文
C# Frequently Asked Questions : Why doesn't C# support default parameters?

翻譯開始
----------------
如C++這種語言,method宣告可包含default value。(譯註:VB.NET、T-SQL亦可)

void Process(Employee employee, bool bonus = false)


這個method可用

a.Process(employee, true);


或者

a.Process(employee);


方式呼叫,

在第二種情況下,多出來的參數將被設定為false。 

但C#並沒有這個功能。

C# team沒提供此功能的其中一個原因,是因為牽涉到對default value的實做因素。在C++的世界,當用戶寫

a.Process(employee);


compiler會產生

a.process(employee, false);


換句話說,compiler將method prototype宣告的default value放進method內,就如同用戶將false當第二個參數一樣。可惜的是,若default value更改後,必須強迫用戶對class重新compile。(譯註:雖然是短短的一句話,卻是C#不提供default value最重要的因素,想想看,假如.NET Framwork 1.x定義bouns參數default value是false

void Process(Employee employee, bool bonus = false);


compiler編譯用戶代碼時,也自動為第二個參數填入false。若很不幸.NET Framework 2.0將預設值改成

void Process(Employee employee, bool bonus = true);


原來的exe拿到.NET Framework 2.0跑,default value仍然是false,如此將可能造成完全相反的結果,唯有將code重新在.NET Framework 2.0重新compile,才能將default value變成true。所以若library/framwork有變動,code必須重新compile,這是很嚴重的!!)。

在這方面,使用overload方式較適當。Framework作者只需定義兩個分開的method,單一參數的method去呼叫兩個參數的method即可解決。這種方式將default value封裝在framework內,若有需要則可立即修改。(譯註:若用這種方式,就算.NET Framework 2.0和.NET Framework 1.0的default value不一樣,用戶也不需重新compile代碼。)

或許可以用一些compiler的技巧,讓語法如C++一樣,然後自動產生overload,但這種方式有一些問題。

第一個問題是,用戶寫出的代碼和compiler編譯出來的MSIL將有很大的差異,一般來說,我們會盡量減少這種狀況,因為這將造成程序員閱讀MSIL困難。(譯註:這就是所謂的Syntax Sugar(語法甜頭),大部分的人是不會去研究C#和MSIL的差異,也不會去閱讀MSIL,但有些人或許會需要研究MSIL,一般來說,少用compiler技巧是對的)。第二個問題是,必須面臨如何產生XML文件註解和如何顯示intellisense。compiler必須有特殊的規則來來為這些overload method產生XML文件註解,且intellisense必須夠聰明為一個單一method展開overload method。(譯註:VB.NET,C++/CLI都可以解決這些問題,所以我覺得這個是C# team的懶惰,呵呵)。

自己撰寫overload method雖然較麻煩,但C# team認為是可以接受的方式。
------
翻譯結束

Conclusion
Eric Gunnerson提出了三個理由為什麼C#不提供default value

1.Lib/Framwork若有改變,用戶代碼需重新compile。
2.會造成C#和MSIL差異太大。
3.XML Document和intellisense難以產生。

1是很嚴重的問題沒錯,但2就還好,反正C#的syntax sugar已經用的很兇,如delegate,所以又多一個syntax sugar也不嫌多。但3就真的是藉口了。

Remark (07/12/2007)
今天發現C++/CLI也沒有default parameter,哈。

posted on 2007-06-29 00:11  真 OO无双  阅读(11301)  评论(25编辑  收藏  举报

导航