2008年7月19日 星期六

關於如何選擇VB和C#

有一位讀者在幾周前來信詢問到這個問題,我答應他要在BLOG上好好討論這個部分。

我相信很多初學者最近特別碰到這個問題,面對在.NET上要採用哪一種開發語言而困擾。在回答這個問題之前,有一個前提是要先確定的,關於效能的問題在這兩個語言之間的選擇是幾乎不存在的,特別是由於硬體設備的關係,因此效能問題很容易補強,若要說效能,到目前為止中高階語言當中C++依舊是效能最好的,Assembly依舊是效能冠軍,但是你會不會用這兩種語言來開發資料庫應用程式,答案是你絕對不會,因為這樣太辛苦了,好,我們的討論就從這一個point開始。

正如同你不會用C++來開發資料庫應用程式一般,除非沒得選擇(某些平台上只能選擇C++),否則有太多更適合用來開發資料庫的語言,C#, VB, Java, delphi...幹嘛選C++?

但是有沒有人會說C++語言不好?不會的...因為大家心裡都明白,不是好不好的問題,而是適不適合的問題!!!
那問題來了,如果答案這麼明確,為何還會有人討論C#和VB到底要選哪一個呢?不是就是適合不適合的問題嗎? 對,但是有一個小麻煩,是C#和VB都是.NET的官方語言,而兩種語言能做的事情幾乎一樣,花的工也差不多,那就讓人困擾了,到底要VB和是C#?

好,探索這個問題之前,我們要明白語言的背景和特色,C#是C Like語言,從C, C++之後,出現了很多C Like語言,C#和Java都是其中之一,他本質上是C的語法,但是沒有C++那麼難,C++當中有很多古時候C語言保留下來的特殊語法,這些語法相當簡約,例如A++,這代表A=A+1,除了A++之外,還有++A這種語法(難倒你了吧,很多人不知道兩者之間的差異...)。C語言又加上物件導向的觀念之後,難度瞬間提升幾十倍吧,很多專家腦袋裡想出來的許多天馬行空的可能,都在 C++上實現了,像是多重繼承這類的觀念,導致原本已經很簡約的C語法,變的進入障礙更高。

PS.你知道C語言為何要那麼簡約嗎? 因為在C發展的那個年代,很多時候無法用鍵盤直接輸入程式執行的,是透過讀卡機把程式輸入電腦裡,而字寫得越多,讀卡紙片就越厚,所以大家盡量把語法搞得越簡單越好...

而Java的出現,簡化了C/C++複雜的語法和架構,有那麼一點去蕪存菁的意味,更貼近商用(注意,是商用)領域,加上那一年internet盛行,所以謂為潮流,Java一直改變,MS卻只有VB和C/C++的開發環境,當年還沒有所謂的Visual Studio,就只有簡簡單單的VB 5,不過話說回來,那時候VB已經有一點點OO的觀念,加上還支援控件等reuse技術,支援事件驅動,支援視覺開發,已經是了不起的成就,那幾年的VB Programmer爆增,全美數幾百萬人跑不掉,幾乎有一半的商用程式是用VB開發的,但是VB卻有著過去的包袱...

說包袱可能不公平,因為VB本來就是設計給初學者用的,進入障礙低,簡單好用,可以快速的開發出一套應用程式,因為這樣,所以VB的語法很簡單,舉例來說,用VB開檔,可能就是簡簡單單的一行程式:
Open "filename" for Output as #1 <-- span="">
任誰都知道上面那行程式是用來開檔的,而且檔案還是用來輸出
如果是C,我記得是...
FILE *f;
f=fopen("xxxx","w+");
不是我在講,當年光那個*f的指標,就搞得我七暈八素,總是忘了加上*導致成是錯誤。你沒有辦法從人類的邏輯搞懂為何開檔的回傳值是一個指標,而運算式的回傳值卻是一個變數,這純粹是為了配合Compile而設計的語法,這不是為人類設計的。

那個年代後期微軟推出了 Visual Studio 97,其中上得了檯面的開發工具包含了Visual Basic 5.0、Visual C++ 5.0及Visual FoxPro,著時謂為風尚了好一陣子。當年同時間還有一個Delphi也很風光, 走的是Pascal路線,我還認真的學過一兩年,Delphi把Pascal發揚光大,但畢竟不是MS這種大公司的敵手,風光了一陣子之後,慢慢就開始有走下坡的趨勢。

而Java則慢慢開始一飛衝天,這時候讓MS陣營很多人發現了Java的好處,比C/C++簡單,能力強,可以跨平台,學習曲線有沒那麼高,豐富的類別函式庫...說不完的優點和前衛的設計,讓MS陣營的開發人員心動,java紅了好一陣子...

MS面對internet痛定思痛,決定來個絕地大反攻,在2002年推出內建.Net Framework 1.0的Visual Studio .NET,這是一個釜底抽薪的改變,一舉把MS開發工具帶向了整合interner、OO以及新的開發框架上,這個改變很重要,但是卻...帶來一場災難。

很多VB開發人員水土不服,改變太大了,ASP開發人員也不買單,ASP.NET被接受的程度不高,產品有一些待解決的問題,這些造成MS很大的壓力,那一年的改變是一個關鍵,他帶領MS的開發人員走向新的世界。那一年,也才是C#剛推出的時候...很多人還在觀望...

到2003年,微軟推出支援.Net Framework 1.1的Visual Studio .NET 2003,狀況才開始慢慢好轉,C#開始被大家接受,VB當中一些死硬派還停留在VB 6.0,也有一部份慢慢移轉到VB.NET上(主要的問題是VB 6.0的程式碼和觀念,幾乎和VB.NET不同)。

而2005年推出.NET Framework 2.0以及Visual Studio 2005(有沒有注意到MS把.NET兩個字拿掉了),則開始奠定如今的基礎,ASP.NET開始大紅(在台灣比較紅),ASP開發人員無可避免的選擇了升級到ASP.NET上,與Java分庭抗禮的時代開始出現,C#開始爭取到不少C/C++/Java/Delphi開發人員,而部分VB 6.0的developer也發現勢不可檔,所以跳入 VB.NET(後來就不叫VB.NET了)的懷抱中。

好,故事是這樣的,真的好長...打字都累了...
那,到底你要選C#還至VB?

這關乎你的目的,從上面的背景你可以發現,VB有悠久的歷史,但式設計VB的專家也一直盡力維護一個分寸,就是VB要符合底下幾個原則:
1.容易上手、學習曲線低。
2.與舊版VB語法大致相容。(現在越來越難了)
3.可以輕易的開發出一套程式。

所以你會發現,依照上面這樣的邏輯,VB具有C#沒有的My Class,這不奇怪,因為My Class很沒道理,不符合OO架構也濫用了靜態型別,有可能導致一些程式設計上的風險。VB的語法似乎比較鬆散,變數的型別轉換比較不嚴謹,但是這些聽起來是缺點,其實換另一個角度想也是優點。

如果我要很快的開發出一套程式,我不是程式設計師背景,不是所謂的科班出身,我也沒打算寫架構很大或很偉大的系統,我可能是數學系的、電機系的、念財務管理的、念工程的...我用VB寫一個小程式是非常非常理想的。沒道理要我用C#,變數的型別對我來說幾乎沒意義,只要程式能跑,算出我要算的東西,或是記錄我要記錄的資料,以後可以查詢,就好了,寫程式幹嘛那麼龜毛?

但,如果你是業界的程式開發人員,這是你吃飯的工具,你倚賴這個謀生,你寫的程式必須可長可久,比較有架構和嚴謹的C#會是比較好的選擇,(不過我要在這邊補一句,在台灣這種需求真的不多,因為沒什麼系統可以活過3年,reuse這個夢坦白說也很難實現,架構很漂亮,但是每次程式幾乎還是重寫,這樣架構再漂亮也沒用,這不是程式設計師的問題,也不是語言的問題,這些問題出在人身上...以後有機會再談),因為設計出的程式比較安全,發生exception的機會比較低,程式比較有架構未來交接維護也方便。(重點在交接,因為developer流動率真的很高)

如果你是MIS,沒有需要開發很大的系統,程式只是你的 "工具" (例如寫個程式進行佈署、建立AD Account,撈資料做報表,算出老闆要的資訊...等),我覺得用VB是比較好的選擇,因為老闆幾乎都要求快,希望很快看到結果,沒人管你架構,不需要為了簡單的一個小程式畫UML、一個下午或是一兩週就可以完成的小程式,靈活和快速是最重要的。

如果你是賣方(軟體廠商、SI、會把你寫的程式當作產品賣出去的),你可能就需要考慮以C#來開發,因為程式設計師的流動率很高、程式的效能要計較(因為客戶會計較)、未來的維護要持久...因為種種原因,讓程式設計師辛苦一點也沒啥不好,所以C#是一個比較好的選擇。

所以如何選? 我認為看需要...
要學哪個? 我覺得都要會一點...

我常跟學員說,在這個時代,我認為你必須要具備雙語(或多語)能力,一法通萬法通,所以VB和C#是開發人員的左右手,沒什麼道理只學其中一種,標準是,你不需要全部會,但是你至少需要看得懂別人寫的Code,如果你習慣用其中一種語言(例如我習慣VB),我覺得那沒什麼關係,每個人都會有自己的習慣,但是若你害怕用任何一種語言或是denial任何一種語言,那就不可以了,你必須對C#和VB都無所懼怕,依照你當時的需要選擇你要開發的語言。

15 則留言:

SHARKY 提到...

您好,冒昧的請教您,因為最近在研讀asp.net的網頁語言,但是看了本篇網誌,有很大的感想,因為目前學習c#語言(想以c#最為基礎),但考慮想要買ASP.NET 2.0深度剖析範例集這本書來做練習,所以想詢問一下是否適合??

David 提到...

當然沒問題,因為範例集這本絕大部分的內容都是實務範例,程式碼的部分其實並不困難,若要以C#進行開發,您也可以考慮把範例的VB碼轉為C#,相信你會在學習過程中掌握到不少技巧...

SHARKY 提到...

感謝您的回覆,讓我充滿買書的衝動與學習的動力,謝謝您的建議...

匿名 提到...

对你们这本《silverlight权威讲座》,我看过了,很不错。可惜是VB的,虽能看懂。要有C#的更好。
有个问题就是,我VS2005的,然后对你们提供的DynamucXaml控件不知道为什么,就是不能引用到我项目中错误:
加载类型时出错,“未能加载文件或程序集 System.Web.Extensions ,version=1.0.61025.0 Culture=neutral, PublicKeyToken=31b3856a364e35”或它的依赖项,系统找不到指定文件
不知道这是什么原因????? 谢谢
这是我邮箱:zbh087@163.com

匿名 提到...

Delphi 是改自 Pascal , 與 Fortran 語法大不同...
都忘的差不多了:<

明昌 提到...

我買了您的ASP.NET 2.0深度剖析範例集
書中有提到如果想查詢完整的程式碼(例如原程式碼可能有一兩個未完善的地方),我記得您以前的網站不是Blog模式,現在改了樣子,我不知道要怎麼去查詢我想要的資料了,還是您有提供在別的網路空間呢?

David 提到...

請告知您需要的資源,我會盡力提供給您。可mail至David@studyhost.com

匿名 提到...

您好,最近正在研讀您的ASP.NET 2.0深度剖析範例集,對於書中說明仍有不甚清楚的地方,讀者專區是否可以提供關於此書的教學影片?或是您在其他網頁空間有提供?by guihua

風之幻術師 提到...

大大您好,
在下正在讀這本書

http://tlsj.tenlong.com.tw/WebModule/BookSearch/bookSearchViewAction.do?isbn=9574424057&sid=32689

書附光碟中的所指向的網址似乎沒有作用了?
http://vb2005.studyhost.com

是否還有備用的網址之類的?

怪獸盒子 (monster's box) 提到...

老師您好,最近正在研讀您的ASP.NET 2.0深度剖析範例集,在使用書上範例所教(命令及參數編輯器)新增資料Oracle日期欄位,出現:輸入字串格式不正確(Datetime),請教老師可以利用(命令及參數編輯器)來解決格式問題嗎?另外,如果要用DataSource 的Insert command來完成新增資料,Oracle要如何進行?

很謝謝老師的幫忙喔!

Frank Chen 提到...

您好:
很開心看到這樣完整的說明,對初學者而言,可以提供一些思考的方向。
有一些意見,提出來討論:
- Delphi是以Pascal為基礎的,與Fortran的 77關聯較小,與Fortran 90/95差異也頗大
- 在Delphi晚一點點,有Builder C++,以Delphi VCL component framework為基礎,用來開發資料庫程式,也頗為快速
- VB與C#有著歷史上對語法的『喜好』。看這兩個語言,從學習曲線來思考或許較為簡單。因為兩者都是架構在.NET framework上。以開發的角度來看,老闆要快速的產生一個報表產生程式,用VB或C#,一樣的快。畢竟,它們都是Rapid Application Development RAD的工具

匿名 提到...

董老師您好,請問您最近預備要出的新書,有沒有包含ADO.Net Data Services Framework?

匿名 提到...

受益良多,解決了我一些煩惱,感謝你!!!

symis 提到...

您的文章寫得不錯,不過有錯字:
1. 就搞得我七暈八素,總是忘了加上*導致成是錯誤。
→七「葷」八素,「程式」錯誤

匿名 提到...

2008年的古文 也讓我獲益良多
文章寫得真不錯