• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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,哈。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C# 实现在线软件自动升级自动下载更新文件发布时间:2022-07-13
下一篇:
c#水晶报表注册码发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap