新聞中心
研究C#和.Net,有很多體會(huì),好的不好的都有。隨便談?wù)劊┐蠹覅⒖肌?/p>

創(chuàng)新互聯(lián)自2013年創(chuàng)立以來(lái),是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元阿克蘇做網(wǎng)站,已為上家服務(wù),為阿克蘇各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108
先說(shuō)說(shuō)它的優(yōu)點(diǎn):
1、C#保留了對(duì)底層操作系統(tǒng)API的直接調(diào)用和指針??隙ㄊ且?yàn)榭吹搅薐ava的速度問題以及JNI的笨重,所以在設(shè)計(jì)C#時(shí)特意保留了這些 C++的特性,避免了重導(dǎo)覆轍,也使得C#可以用來(lái)開發(fā)系統(tǒng)軟件。普通應(yīng)用都是調(diào)用.Net的程序集(相當(dāng)于Java的類庫(kù),程序集里面都是byte code,不是native code),對(duì)于速度敏感,或者平臺(tái)相關(guān)型應(yīng)用,直接通過(guò)特定聲明來(lái)調(diào)用Windows API。這樣就可以功能,效率和速度都兼顧,解決各種各樣的應(yīng)用層問題和系統(tǒng)層問題(可以用C#來(lái)寫系統(tǒng)軟件了),用一種語(yǔ)言來(lái)解決所有場(chǎng)合的大部分問題,所以MS對(duì)C#很有信心。
不過(guò)實(shí)際上完全用C#開發(fā)系統(tǒng)軟件還是不太可能的,畢竟經(jīng)過(guò)C#的包裝以后,比純種的C還是要稍微慢一些,但是肯定比純種的C#字節(jié)碼快太多了。但是當(dāng)你用C#開發(fā)應(yīng)用軟件的時(shí)候,卻不可避免的涉及到底層調(diào)用的時(shí)候,可以方便的直接用C#來(lái)實(shí)現(xiàn),不用像Java那樣束手無(wú)策的去向C++求救,通過(guò)笨拙的JNI調(diào)用,顯得高明。
2、在Windows平臺(tái)上.Net CLR比Java的JRE速度快,聯(lián)想到當(dāng)年MS做的JVM,所以也不是很奇怪。只不過(guò)CLR速度足夠快的話,C#字節(jié)碼運(yùn)行起來(lái),普通應(yīng)用就不會(huì)感覺出來(lái)速度比純本地代碼慢。我的感覺就是這樣,基本上感覺不出來(lái)CLR啟動(dòng)和加載程序集的明顯延遲,而不管用AWT,Swing還是SWT,JVM啟動(dòng)和加載類庫(kù)的延遲是非常明顯的,這就是真正不妙的地方了,不管Sun,IBM,BEA還是Open Souce 社區(qū),在JVM的效率上還要繼續(xù)加油。
3、開發(fā)工具IDE,老生常談了,不過(guò)確實(shí)也很重要,對(duì)比一下Visual .Net Studio和做的最好的JavaIDE,JBuilder或者Eclipse吧,不在一個(gè)級(jí)別上。寫普通的軟件,甚至Web應(yīng)用,IDE作用不明顯,特別是對(duì)于有Unix背景的人來(lái)說(shuō),更愿意使用純文本工具。但是涉及到GUI開發(fā)和企業(yè)應(yīng)用的開發(fā),一個(gè)強(qiáng)大的工具是必須的。
GUI開發(fā)來(lái)說(shuō),Visual .Net Studio開發(fā)GUI就如同使用VB開發(fā)GUI,方便和快捷的難以想像,再加上C#的程序集比VB的控件集,比VC的MFC的設(shè)計(jì)優(yōu)秀的不在同一個(gè)級(jí)別上。所以在開發(fā)GUI方面,C#比VB還更加優(yōu)秀,基本上和Borland的C++ Builder的水平相當(dāng),其操作的便捷還在其之上。
反觀Java,Eclipse空有一個(gè)SWT,也不去做一個(gè)好點(diǎn)的GUI開發(fā)環(huán)境出來(lái)。JBuilder是公認(rèn)的最好的Java GUI開發(fā)IDE,但是仍然難用的很,為什么?關(guān)鍵處還在于AWT,Swing和SWT圖形庫(kù)的布局設(shè)計(jì)上。
這3個(gè)圖形庫(kù)統(tǒng)統(tǒng)都是使用布局管理器來(lái)布局,布局好了以后才能放控件。不能夠直接拖放控件實(shí)現(xiàn)絕對(duì)像素定位,也很難實(shí)現(xiàn)對(duì)控件大小,位置的操縱。
這也是有一定的原因,Java為了實(shí)現(xiàn)跨平臺(tái)的GUI,因此不能夠使用像素定位,否則在不同平臺(tái)會(huì)有不同的外觀表現(xiàn)。
而C#就不管那么多了,既然只在Windows平臺(tái)上實(shí)現(xiàn),直接就采用像素定位(當(dāng)然布局定位也可以用),外觀的控制自然可以“所見即所得”了。
由于這個(gè)先天的原因,Java的GUI開發(fā)是不可能比C#更方便的,JBuilder能做到這樣,也差不多到極致了,大家也只能忍受了。
企業(yè)開發(fā)方面,C#需要SQL Server(Oracle也可以,但是不如SQL Server方便),IIS和MTS的配合,Java需要DB,App Server的配合。由于C#只管SQL Server和IIS,甚至只管IE瀏覽器,所以Visual .Net Studio可以做的很方便,整個(gè)開發(fā)過(guò)程一體化,不用考慮其它的實(shí)現(xiàn)。而JBuilder需要考慮各種不同的軟件實(shí)現(xiàn),特別是App Server,簡(jiǎn)直就是五花八門,JBuilder能夠做到這樣,在圖形設(shè)計(jì)器里面設(shè)計(jì)EJB,從DB里面導(dǎo)入Entity Bean,方便的在所有的主流的App Server上自動(dòng)編譯EJB,部署EJB,測(cè)試EJB,也算做到極致了。
由于App Server五花八門和EJB部署本身的高度復(fù)雜度的原因,Java的企業(yè)開發(fā)也是遠(yuǎn)遠(yuǎn)不如C#來(lái)的快捷和方便。
這些原因?qū)е铝擞袝r(shí)候一個(gè)J2EE項(xiàng)目會(huì)比.Net開發(fā)周期長(zhǎng)兩三倍的現(xiàn)象。
說(shuō)完了C#和.Net的優(yōu)勢(shì),再說(shuō)說(shuō)不足:
1、.Net平臺(tái)支持多語(yǔ)言從技術(shù)上和開發(fā)角度來(lái)說(shuō)是噱頭,這完全是一個(gè)陰謀。
從 ISV角度來(lái)看,完全沒有支持多語(yǔ)言的必要,難道做一個(gè)項(xiàng)目,不同的模塊用不同的語(yǔ)言來(lái)實(shí)現(xiàn)有價(jià)值嗎?反過(guò)來(lái)說(shuō),這是一個(gè)災(zāi)難。對(duì)于將來(lái)的維護(hù)的升級(jí)來(lái)說(shuō)是一個(gè)巨大的災(zāi)難,用VB.Net寫的模塊,C#程序員改不了,用C#寫的模塊,J#程序不能維護(hù),人為的造成了混亂。再說(shuō)C#又不是什么很難的東西,學(xué)習(xí)曲線也不高,何必不用C#,非要和自己過(guò)不去呢?
支持多語(yǔ)言的唯一目的在于吸引其它語(yǔ)言的開發(fā)人員轉(zhuǎn)到.Net平臺(tái)上來(lái),不過(guò)當(dāng)你被吸引轉(zhuǎn)過(guò)來(lái)以后,還是發(fā)現(xiàn)用C#比較好,用你原來(lái)的移植語(yǔ)言不爽,還是不得不重新學(xué)習(xí)C#,這才發(fā)現(xiàn)上了大當(dāng)了。所以完全是一個(gè)商業(yè)陰謀。
2、.Net在將來(lái)也不可能支持其它操作系統(tǒng)平臺(tái)。
在前面已經(jīng)提到了.Net和IIS,MTS,SQL Server等MS平臺(tái)軟件捆綁的很死,將來(lái)還要捆綁更多的MS軟件,像IE,MSN等等。況且.Net依賴Windows也非常緊密。雖然有一個(gè) Open Source的Mono項(xiàng)目在移植CLR到Linux上來(lái),不過(guò)據(jù)我來(lái)看,也只能做到僅此而已,光把CLR移植過(guò)來(lái)是沒有多大價(jià)值的,需要把 IIS,MTS,IE,MSN,SQL Server等等軟件統(tǒng)統(tǒng)移植過(guò)來(lái)才能構(gòu)成一個(gè)Linux平臺(tái)上的.Net,但是這可能嗎?
所以MS開放C#語(yǔ)言和CLI的規(guī)范又是一個(gè)商業(yè)陰謀,表面上裝出一副擁抱開放的姿態(tài),骨子里面卻壟斷的很。而且從MS的商業(yè)行為也可以看出這一點(diǎn),我們知道MS把全部身家都?jí)涸?Net上和J2EE陣營(yíng)競(jìng)爭(zhēng),如果.Net是一個(gè)開放平臺(tái),可以自由移植到Linux上,那么MS有什么理由不支持 Linux操作系統(tǒng)呢?如果Linux上的.Net 支持的很好并且普及開來(lái)的話,J2EE恐怕只有在AIX和Solaris上茍延殘喘的份了。正是因?yàn)镸S要把.Net鎖定Windows,所以才害怕 Linux,如果Linux在服務(wù)器市場(chǎng)擊敗了Windows,那么.Net也只剩下茍延殘喘的份了。所以現(xiàn)在MS視Linux為眼中釘,肉中刺。
所以MS開放C#和CLI,除了做作姿態(tài)之外,也可以在更多的OS上普及C#編程的教學(xué),等你們熟悉了C#編程,再乖乖的在我的Windows上替我開發(fā)吧。
3、.Net傻瓜相機(jī)
眾所周知,C#和.Net的學(xué)習(xí)曲線比Java和J2EE平坦的太多了。C#學(xué)習(xí)比Java輕松很多,而.Net框架學(xué)習(xí)比J2EE輕松太多了。那么Java程序員投入多了幾倍的時(shí)間和精力就完全沒有價(jià)值了嗎?況且從開發(fā)角度來(lái)說(shuō),同樣的項(xiàng)目C#也要比Java周期短,程序員開發(fā)輕松很多,難道這個(gè)世道對(duì)Java程序員這么不公平嗎?沒有理由下的功夫少,卻得到同樣的收獲,所謂世上沒有白吃的午餐。
經(jīng)過(guò)我對(duì)C#和.Net的粗淺研究,我發(fā)現(xiàn)其實(shí)這是一個(gè)傻瓜相機(jī)和專業(yè)相機(jī)的問題。MS做出來(lái)的.Net的好學(xué),易用,就如同傻瓜相機(jī)一樣,一按就OK,不過(guò)照片質(zhì)量一般。專業(yè)相機(jī)麻煩是麻煩,不過(guò)經(jīng)過(guò)專業(yè)人士的手,拍出來(lái)的都是高質(zhì)量的照片,當(dāng)然你讓普通非專業(yè)人員去操縱專業(yè)相機(jī)確實(shí)太勉強(qiáng)了一些。
.Net傻瓜相機(jī)確實(shí)太方便了,方便到了對(duì)組件的管理都對(duì)程序員透明化了。數(shù)據(jù)庫(kù)緩沖池是由OLE DB Driver自動(dòng)管理的;組件的管理是由MTS自動(dòng)管理的,程序員不需要去管這些中間層的問題,開發(fā)好組件,用GAC注冊(cè)一下就好了,使用的過(guò)程中,由.Net平臺(tái)的MTS等等實(shí)際上完成App Server功能的服務(wù)自動(dòng)處理。.Net Framkwork Configuration配置工具也是如此的簡(jiǎn)單,都是MS在幫你代勞。在運(yùn)行.Net程序的平臺(tái)上注意一下dllhost.dll這個(gè)進(jìn)程,就是專門管理組件的。
不過(guò)從反面的角度來(lái)看,開發(fā)人員喪失了對(duì)組件部署的控制能力。在J2EE的世界,EJB或者說(shuō)J2EE部署者是一個(gè)很重要的腳色,絕對(duì)不是可有可無(wú),企業(yè)應(yīng)用軟件的運(yùn)行性能很大程度上依賴對(duì)對(duì)于中間層組件的部署和性能調(diào)節(jié)和排錯(cuò)。所以EJB組件本身就是一個(gè)可以通過(guò)內(nèi)部的XML配置文件參數(shù)進(jìn)行性能自調(diào)節(jié)的組件,App Server更是提供了數(shù)量龐大,功能繁多的調(diào)節(jié)和部署選擇。對(duì)于一個(gè)要求比較嚴(yán)格的企業(yè)軟件來(lái)說(shuō),你要提供高效,穩(wěn)定和安全的運(yùn)行,手工進(jìn)行復(fù)雜的 tunning是必須的。對(duì)于只有一個(gè)全自動(dòng)按鈕的.Net傻瓜相機(jī)來(lái)說(shuō),實(shí)在是無(wú)能為力。
所以有所得就必有所失,.Net傻瓜相機(jī)在贏得了大部分普通程序員的同時(shí),仍然無(wú)法進(jìn)入企業(yè)高端領(lǐng)域,或者至少在目前是如此。不過(guò)不排除將來(lái)有這個(gè)可能性。
再看J2EE,EJB確實(shí)笨拙,開發(fā)起來(lái)速度也慢,但是一個(gè)構(gòu)造良好,設(shè)計(jì)合理的J2EE應(yīng)用經(jīng)過(guò)高手的tunning,絕對(duì)是穩(wěn)如磐石,令人放心。其系統(tǒng)的質(zhì)量也不是目前的.Net所能比的。
說(shuō)到這里覺得很有趣,MS從開始到現(xiàn)在,幾乎所有的軟件產(chǎn)品都在充當(dāng)傻瓜相機(jī)的角色,就是到了.Net,MS也沒能改變宿命。
Windows vs Unix
SQL Server vs Oracle
.Net vs J2EE
所以我敢斷定,將來(lái)J2EE和.Net的處境也會(huì)類似今天服務(wù)器市場(chǎng)的Windows Server與Unix,數(shù)據(jù)庫(kù)市場(chǎng)的SQL Server和Oracle。普通應(yīng)用會(huì)更多的采用.Net,而高端應(yīng)用更多采用J2EE。另外.Net還有一個(gè)不利的因素是J2EE雖然好像陽(yáng)春白雪,其實(shí)下里巴人。J2EE既可以采用昂貴的商業(yè)App Server和DB的強(qiáng)強(qiáng)組合,也可以采用完全不要錢的免費(fèi)方案,用成本來(lái)沖擊低端市場(chǎng),所謂各有各的活法。這也是MS比較頭疼的。
4、分布式領(lǐng)域的不成熟
這體現(xiàn)在幾個(gè)方面:
(1) 分布式應(yīng)用的Session管理
.Net的方案是幾臺(tái)App Server把全局Session放在一個(gè)共享的SQL Server中,實(shí)在是...笨拙,不用再評(píng)價(jià)了!
好好學(xué)習(xí)一下Weblogic集群的內(nèi)存復(fù)制技術(shù)吧!.Net還差的遠(yuǎn)呢
(2) .Net的分布式組件
MS的DCOM已經(jīng)過(guò)時(shí)了,讓我們看看在.Net里面如何實(shí)現(xiàn)分布式組件。
首先在.Net中,普通組件和分布式組件是不同的,在編寫代碼的時(shí)候采用的方法就不同。一般組件類似于J2EE中的普通類,分布式組件要采用TCP Channel或者HTTP Channel來(lái)實(shí)現(xiàn),完全兩種不同的編程模型,MS建議采用HTTP Channel,因?yàn)榭梢源┰椒阑饓?。而?duì)于J2EE應(yīng)用來(lái)說(shuō),一般商業(yè)組件都采用EJB編寫,分布還是不分布,區(qū)別只是部署的時(shí)候放不放在一臺(tái)機(jī)器而已。我沒有仔細(xì)研究過(guò)TCP Chaneel或者HTTP Channel,不便于和EJB做對(duì)比,不過(guò)感覺上,這種Channel的可編程性和可管理性比EJB還差得遠(yuǎn)。
(3) XML Web Services
.Net 上的Web Services加了一個(gè)耐人尋味的XML,什么原因大家體會(huì)一下。.Net的Web Services實(shí)現(xiàn)要靠IIS的ASP.Net,把組件以asmx的后綴放到IIS的Web目錄下,當(dāng)通過(guò)瀏覽器第一次訪問的時(shí)候,Web Services自動(dòng)編譯和發(fā)布,同時(shí)生成WSDL。編程起來(lái)倒是好方便,但是我隱隱約約的感覺到MS的Web Services方案另有用意。什么用意呢?聯(lián)想到第(2)點(diǎn),我覺得MS的XML Web Services是DCOM的替代品。也就是說(shuō)MS沒有想到一個(gè)更好的解決分布式組件的方法,既可以容易的使用C#編程,同時(shí)又很容易部署,很容易進(jìn)行分布式組件調(diào)用。萬(wàn)般無(wú)奈之下,在上面的Channel方案之外,又搞出這個(gè)XML Web Services,其實(shí)就是MS的分布式組件而已。但是HTTP SOAP調(diào)用的效率和安全性目前還比較差,還不能和EJB調(diào)用相比。況且XML Web Services仍然沒有解決可管理性的問題,Web Services的性能調(diào)節(jié)看來(lái)只能靠IIS了。看看吧,EJB確實(shí)夠笨拙,但是可編程能力,可管理能力,至今仍然是MS望塵莫及的。
所以就目前的.Net框架來(lái)說(shuō),MS還是暴露了在企業(yè)領(lǐng)域資歷不夠的弱點(diǎn),Anders是程序語(yǔ)言設(shè)計(jì)的天才,設(shè)計(jì)了Turbol Pascal(也是我最早最喜歡的編程語(yǔ)言,在高一開始學(xué)習(xí)),Delphi和C#,不過(guò)他還不是企業(yè)領(lǐng)域的天才。
不排除.Net將來(lái)有趕上來(lái)的可能,不過(guò)目前J2EE在分布式領(lǐng)域還有很大領(lǐng)先優(yōu)勢(shì),只不過(guò)Sun不太掙氣了。
5、看似不錯(cuò)的Web Form
Web Form也是我覺得很新穎的技術(shù),甚至覺得很有前途,不過(guò)實(shí)際試用之后,我出了一口氣,“不過(guò)如此”
Web頁(yè)面由于HTML的限制,表現(xiàn)能力很弱,于是Web Form技術(shù)出來(lái)了,就像GUI程序設(shè)計(jì)一樣來(lái)拖拉控件來(lái)設(shè)計(jì)Web頁(yè)面,好像很不錯(cuò),其實(shí)問題也有不少。因?yàn)閃eb頁(yè)面的設(shè)計(jì)和Web頁(yè)面的編程是分離的,美工人員使用DW設(shè)計(jì)Web頁(yè)面,程序人員嵌入代碼。程序人員不負(fù)責(zé)Web頁(yè)面的設(shè)計(jì),如果都象Web Form這樣,使用服務(wù)端動(dòng)態(tài)生成HTML的表單元素的話,那么美工人員用DW一打開Web頁(yè)面源代碼,就會(huì)發(fā)現(xiàn)和在Visual .Net Studio里面的Web頁(yè)面已經(jīng)面目全非了。除非Web程序員把美工的活一肩挑,否則Web Form在Web程序員和美工之間的配合就是一個(gè)大問題。
6、C#的程序集還不夠豐富
C#出來(lái)的時(shí)間比較短,而且因?yàn)槌鲎訫S之手,所以難以吸引大批的Opensource人員,目前Java的Opensource的類庫(kù)極大的豐富,幾乎所有你能夠想得到的功能,一定可以在網(wǎng)絡(luò)上找到某些人已經(jīng)編寫好的Java類庫(kù)提供你來(lái)使用,這種優(yōu)勢(shì)也是很可怕的。C#目前達(dá)不到,以后也達(dá)不到這樣的境界。
我對(duì).Net的認(rèn)識(shí)還很不夠,J2EE vs .Net是一個(gè)熱門話題,眾說(shuō)紛紜。在我粗淺的研究C#和.Net之后初步的認(rèn)為,從技術(shù)角度來(lái)看,如果你對(duì)J2EE已經(jīng)非常精通了,那么目前也確實(shí)沒有必要轉(zhuǎn)到.Net上,除非出于市場(chǎng)的需要,或者其它的什么商業(yè)因素。況且在企業(yè)應(yīng)用領(lǐng)域,.Net還做得不夠好,仍然有很長(zhǎng)的路要走。未來(lái)將是.Net和J2EE共存的局面,就像Windows vs Unix一樣,低端應(yīng)用更多的采用.Net,高端應(yīng)用更多的采用J2EE。
我覺得C#從語(yǔ)言角度來(lái)說(shuō),設(shè)計(jì)的不夠嚴(yán)謹(jǐn)。不單是語(yǔ)言,整個(gè).net體系結(jié)構(gòu)都能給我這種感覺,很多方面都是為了開發(fā)時(shí)候的方便和快捷,屏蔽了或者隱藏了很多比較復(fù)雜的實(shí)現(xiàn),而這些東西在Java中,都是程序員必須自己手工去處理的。
舉個(gè)簡(jiǎn)單的例子,對(duì)于Java的RMI來(lái)說(shuō),要編寫interface和interface的實(shí)現(xiàn)類,這個(gè)實(shí)現(xiàn)類要可以序列化,并且要用工具生成stub和skelton類。遠(yuǎn)程調(diào)用的客戶端只需要一個(gè)interace類就可以了。
在.net里面,只需要寫一個(gè)實(shí)現(xiàn)類,象interface類,stub,skelton全部都是.net自動(dòng)生成的,程序員看不到也不知道其內(nèi)部運(yùn)作的情況。這樣情況下,客戶端就必須有一份服務(wù)端實(shí)現(xiàn)類的拷貝,而從底層來(lái)說(shuō),實(shí)際上,客戶端需要的是實(shí)現(xiàn)類的接口,而不是實(shí)現(xiàn)類本身。
更進(jìn)一步,如果使用IIS作為遠(yuǎn)程服務(wù)端提供者,所有的遠(yuǎn)程處理都寫在配置文件里面,編寫一個(gè)本地對(duì)象和編寫一個(gè)遠(yuǎn)程對(duì)象是完全一樣的。
所以我覺得.net像傻瓜相機(jī),程序員的工作已經(jīng)被極大的簡(jiǎn)化了,更何況還有一個(gè)高度智能化的IDE來(lái)幫助你生成代碼。生產(chǎn)效率的提高真不是一倍兩倍,而是五六倍。
Java的體系特別的嚴(yán)謹(jǐn),所有的架構(gòu)都是一絲不茍,與理論高度吻合,缺點(diǎn)是未免不夠靈活,實(shí)現(xiàn)起來(lái)比較煩瑣,工作量比較大。不過(guò)一個(gè)設(shè)計(jì)優(yōu)秀的Java軟件是經(jīng)得起千錘百煉的,非常穩(wěn)固。
.net體系設(shè)計(jì)的更加靈活,極大的提高了生產(chǎn)率。同時(shí)也極大得降低了服務(wù)端中間層開發(fā)的門檻,所以估計(jì)未來(lái)的服務(wù)端程序員將大幅度的貶值,而這就是.net普及的后果。
另外我在使用的過(guò)程中發(fā)現(xiàn).net運(yùn)行事務(wù)處理,對(duì)象池,分布式應(yīng)用這些比較高端的東西的時(shí)候,消耗的CPU和內(nèi)存資源也是驚人的高,
App Server(IIS, ASP.Net, COM+) + SQL Server 2000這樣的組合跑類似的應(yīng)用消耗的CPU和內(nèi)存資源已經(jīng)超過(guò)了
App Server(Weblogic Server7.0) + Oracle8.1.7 這樣的組合。
而效率并沒有明顯比Java Based高,甚至感覺.net處理事務(wù),對(duì)象池相當(dāng)?shù)木徛R陨辖榻B研究C#和.Net的體會(huì)。
文章名稱:研究C#和.Net的體會(huì)
本文網(wǎng)址:http://m.fisionsoft.com.cn/article/cdhhgis.html


咨詢
建站咨詢
