橫向技術分析C#、C++和Java優劣

本文將從技術人員的角度橫向分析C#、C++和Java優劣,其實選擇Java陣營還是.NET陣營,大家可以根據自己的實際需要來確定。


C#誕生之日起,關于C#與Java之間的論戰便此起彼伏,至今不輟。拋卻Microsoft與Sun之間的恩怨與口角,客觀地從技術上講,C#與Java都是對傳統面向對象程序設計在組件化軟件時代的革新之果,可謂殊途同歸。雖說兩個語言有著"90%的重疊",但那另外"10%的較量"也往往能夠左右一個天平的方向。本文將攜90%之共,論10%之異,對兩個語言做純技術品評。文章不涉及兩個語言的公司,市場等臺面后的事情--雖然這往往也會影響人們對編程語言的選擇。也不預備得出誰是誰的Killer,讀者應該選擇誰的問題。"語言選擇乃藝術而非技術問題",業界早有定論,無需多言。

C#和Java都提出了對傳統C++艱深,晦澀的語法語義的現代改良。在語法方面,兩者都擯棄了C++中函數及其參數的const修飾,宏代換,全局變量和全局函數等許多華而不實的地方。在繼承方面,兩者都采用了更易于理解和建構的單根繼承和多接口實現的方案。在源代碼組織方面,都提出了聲明與實現于一體的更好的邏輯封裝。在類型系統方面,兩個語言都在中間語言IL或字節代碼的基礎上提出了映射(Reflection)這樣的概念,徹底革新了傳統C++運行時類型鑒別的問題。但在大刀闊斧地對C++進行改革的同時,C#顯得更為保守,它對很多原來C++中很好的性質予以了保留,如基于棧分配的輕量級的結構類型,枚舉類型,引用(ref),輸出(out),數組(params)修飾的參數傳遞方式等,這些在Java中都被很可惜地丟掉了。在基本類型和單根繼承的對象之間的類型統一方面C#提出的box/unbox要比Java的包裝類顯得高明,效率也要好。

對C++不安全的指針及內存分配方式,C#和Java都提出了托管執行環境。效率問題是托管執行環境一直以來令人詬病的地方,Java虛擬機(JVM)的解釋執行方式曾經讓很多開發者"慢的不可忍受"。C#的JIT編譯方式為C#在這塊戰場上贏得贊聲一片,某些C#托管代碼甚至比傳統C++代碼都快。雖然現在各廠商實現的Java平臺也都一致地采取了JIT編譯方式,但C#在這方面的比較優勢非常明顯--C#的目標編譯語言IL從設計初始就把效率擺在了重要的地位,而Java的字節代碼的設計卻有些魯莽。托管執行環境經過幾年的實踐,在現代軟件界已經達成了共識,效率的犧牲換來的是高度安全的代碼--當然前提是犧牲的效率必須足夠的小,至少可以忍受。值得指出的是在這里C#同樣"念念不忘老一輩C++程序員",C#允許我們在unsafe上下文中進行指針操作。數組的索引越界檢查,類型安全在C#和Java中都被提到了相當的高度。在異常處理方面,不管從內置支持,還是從執行效率來講,C#都較Java略勝一籌。

"一次編程,多處執行"是程序設計一直以來的一個訴求,尤其是在現代互聯網絡時代。在跨平臺方面,Java的支持和實現都是為人稱道的,雖然JVM的速度仍然讓人備感頭疼。而C#雖然在底層構造方面對移植性進行了充分的考慮,但至少目前還沒有成熟的,經過檢驗的產品。C#在跨平臺方面似乎更熱衷于XML Web Services互操作,而不是跨平臺編程。但C#通過其基礎語言構造(CLI)對二十多種主流語言的對象級的互操作支持,又極大地提升了C#的技術地位。和COM組件廉價地互操作也為C#掙到不少分數--保持一個兼容的體系對現代軟件工業非常重要,也是對廣大開發人員負責任的表現。

面向組件無疑是當代軟件開發的主流。C#對組件編程甚至到了"迷戀"的地步,這與6年前就出道的Java不可同日而語--當然這是時代問題。C#通過屬性,索引器,委派,事件,操作符重載,特征,版本等實現了其對組件編程的第一手的支持。雖然這些在Java中都可以通過方法,接口或者適配器來間接地實現,但軟件業的歷史告訴我們這無論對編程效率或者邏輯設計都是一種極大的損傷--高級語言首先面對的是人,而不是機器。除去這些語言層面的組件支持機制,.NET平臺也為組件的配置,運行,管理等提供了一攬子解決方案,而為組件開發量身定做的Visual Studio.NET更是令人興奮,這都為C#的組件編程開辟了廣闊的天地。在其他技術方面Java的微弱劣勢尚且可以忽略不計,但在組件編程方面Java相較于C#卻有著不可治愈的硬傷。尤其對于從C++和Visual Basic背景過來的開發人員,C#在這方面有著不可抵擋的魅力和誘惑。

鑒于XML Web Services在下一代企業分布式計算中的地位,我們有必要在這方面對兩個語言有一個簡單的交代。在XML Web Services的操作方面,.NET平臺直接在IL中間語言中的內置XML支持使得C#與生俱來地成為下一代Web服務的首選,這是通過API集來支持Web服務的Java所不能比的。在C#中,XML,SOAP,UDDI,WSDL等底層協議被構建成了面向開發人員的組件,而Java中這些仍然是JAX(Java XML API)等底層協議的操作函數。當然這種局面可能僅僅是時間問題,一個強大的高效的Web Services組件模型對Java來說并不是不可逾越的鴻溝。

在語言標準化方面,微軟也史無前例地做出了令人贊賞的動作。目前C#及.NET平臺基礎構造已遞交歐洲計算機制造商協會ECMA,經過標準化后的C#將可由任何廠商在任何平臺上實現其開發工具及其支持軟件,這為C#的發展提供了強大的驅動力。而Java在這方面雖有動作--JCP(Java Community Process),但無疑只能是準標準化。在組件化軟件時代擁有一門像C++一樣的標準化語言,對軟件界尤其是廣大開發人員非常重要。

當然兩個語言的全面的技術品評絕非僅僅上述幾點簡單的羅列比較,其后端平臺(C# for .NET, Java for J2EE),及其編程框架的支持,各語言相關工具的實現,現有的系統基礎等等都對程序設計語言的發展產生相當的影響。從純技術角度來講,C#無疑較Java更具競爭力。爭吵誰抄襲誰也沒有意義--技術的發展本來就是一個相互借鑒的過程。純技術較量也并不能決定這場論戰的勝負--如果非要一決雌雄的話。軟件界倒樂見競爭,經過市場錘煉的技術才能更好地為我們服務,讓我們拭目以待!

【編輯推薦】

  1. 詳解C#編程中的反射機制與方法
  2. Fan——類似Java和C#的新語言
  3. C#連接數據庫和更新數據庫



如果你的學歷和能力,只能進入一般的軟件公司或集成公司,那么選擇微軟的技術體系不錯。因為微軟體系,網上很多學習資料,而且大量的企業應用是用微軟技術開發的,而且很多公司也用微軟技術。所以公司多,你好找工作。微軟的技術一般固定:C#+Asp.net+SQLSERVER+Visual Studio。如果你的學歷和能力,能進入做大型企業應用的公司,那么你就選擇JAVA的技術體系。因為現在大型企業,基本都用JAVA開發。你可以從eclipse、structs、hibernate、WebService、Tomcat、Apache、JBoss、POJO、Oracle開始學習,然后再學習WebLogic、WebSphere、Portal技術、工作流技術。如果你想進入互聯網公司或web2.0創業公司。那么一般Php、Mysql、Apache、Ruby on Rails、Python是你的學習目標。如果你想進入手機開發,那么Symbian和C++(Nokia,市場份額最大)、J2ME(android產品,google發布,還未正式生產,但筆者認為很有前途)、Windows Mobile(微軟,好開發,從開發思路到工具到語言,都是你所熟悉的)。這三類都會三者鼎立,誰也不會把誰干掉。至于5年之后,就不好說,至少5年內,是手機時代,是手機無線時代,每個廠商都在爭搶這一塊未來最有錢途的肉。如果你想進入目前炙手可熱的網游公司。做服務器端,你得C++過硬、網絡傳輸技術過硬、并發線程處理、了解Linux編程要和了解windows編程一樣深入。如果你想做客戶端,那么圖形圖像處理算法你得首先過關。當然,現在很多引擎、工具、AI包、材質庫、腳本減少了不少客戶端編程的難度。如果你想進入現在已經未來10年內一直很熱的嵌入式編程,那么C++,而且你的單片機編程你得過關。中國是世界第一制造大國,而且這種局面在5-10年內也很難改變。制造,過去比誰的工人成本低。但是現在材料和人工的增長,使制造壓力巨大。就只能提升自己的制造能力。制造高尖端的產品,就需要高尖端的流水線。而且,中國的電子產品也越來越強大,日本產品從最初的獨霸中國,漸漸變成了中國國貨的天下。在手機上、數碼相機上、家電、冰箱、DVD、空調、汽車、交通、醫療、數控,等等,很多領域需要嵌入式編程。就連咱們的嫦娥一號也是嵌入式編程的典范。華為、中興這些通信設施也是嵌入式編程范圍。當然,你也可以劍走偏鋒。過去是Notes編程,隨著國產OA的興起,Notes編程漸漸衰退。但是,中國現在大型企業都在上線ERP,而且大多用的是Oracle或SAP的ERP。這些ERP產品,都提供了客戶化定制編程開發環境,提供了完備的應用API。大型企業應用ERP,都需要定制化開發,大量缺乏這類人才。但是,市面上這些學習資料都非常少,這是個難題。另外,現在的外包也非常熱,各地建立外包園,就跟當年建立軟件園一樣群起。想進入外包公司,首先日語或英語需要過關。咱們國家的外包,一般來自日本和歐美。在開發中,一般也是三種語言的主流:C++、C#、JAVA。所以,從以上分析來看,C++、C#、JAVA,都是當今的主流。都在各方面都應用很廣。你選擇哪一類都會有很多的機會和空間。但如果你學了C++,又怕以后碰不到C++的工作,還要學C#,還要學JAVA,那么你終將一事無成。不要怕,鉆一門足矣。不過,擁有了一份技術技能,你能應聘進入一家公司。但是,一家軟件公司如何管理,你是否適合這種管理,你在這個團隊中能扮演什么角色,你在公司中奮斗的路徑是什么,我會在下一篇詳細介紹軟件公司管理的時候給大家講到。我是工作2年后就跳一次,然后加15%的薪水呢,還是有計劃的發展我的IT職業呢?還是我就混一混,不好玩我就換行業呢?你的路,你自己把握。但,千萬不要自己玩自己,不好玩。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452403.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452403.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452403.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

軟件測試中的存根程序

存根程序用來代替被測試的模塊所調用的模塊,因此存根程序也稱為“虛擬子程序”,它利用被它代替的模塊的接口,只做盡可能少的數據操作。

計算機網絡應用云計算,計算機網絡云計算的類型

原標題:計算機網絡云計算的類型隨著現代計算機網絡技術的不斷發展,越來越多的與計算機網絡有關的現代化技術得以出現,并且有著廣泛的應用,其中云計算技術就是比較常見的一種,在實際應用中發揮著較高的價值。在信息時代…

sublime_text快捷鍵

1、注釋:選中文本后,CTRL / 2、CTRL N,CTRLS,保存成.html文件后,只需要輸入感嘆號!,然后tab鍵,即可打印出基本的html格式!轉載于:https://www.cnblogs.com/JAVA-STUDYER/p/855040…

Diango博客--15.通過 Django Pagination 實現簡單分頁(一)

文章目錄0.思路引導1.Paginator 類的常用方法2.用 Paginator 給文章列表分頁3.在模板中設置分頁導航4.效果展示0.思路引導 1)當博客上發布的文章越來越多時,通常需要進行分頁顯示,以免所有的文章都堆積在一個頁面,影響用戶體驗。…

SpringMVC 測試 mockMVC

SpringMVC測試框架 基于RESTful風格的SpringMVC的測試,我們可以測試完整的Spring MVC流程,即從URL請求到控制器處理,再到視圖渲染都可以測試。 一 MockMvcBuilder MockMvcBuilder是用來構造MockMvc的構造器,其主要有兩個實現&…

自頂向下和自底向上測試的優缺點

自頂向下測試方法的主要優點是不需要測試驅動程序,能夠在測試階段的早期實現并驗證系統的主要功能,而且能在早期發現上層模塊的接口錯誤。 自頂向下測試方法的主要缺點是需要存根程序,可能遇到與此相聯系的測試困難,低層關鍵模塊中…

C++ class中的靜態(static)成員

C class中的靜態(static)成員 (1) 靜態數據成員 ①一般地靜態數據成員在該類定義之外被初始化,如同一個成員函數被定義在類定義之外一樣。在這種定義中的靜態成員的名字必須被其類名限定修飾,例如下面是_interestRate的初始…

用計算機彈可惜不是你,可惜不是你 還是幸虧不是你

一、 你沒有再挽留 我也沒有再回頭 就這樣 無風無雨也無晴 無疾而終二、 是我孤陋寡聞不知你心有人三、 如果作業有葬禮,全體學生定當盛裝出席.四、 縱使我有千般好 你也看不到 因為你沒有一雙愛我的眼睛五、 原來暫時共你沒緣分 來年先會變得更合襯六、 真的別回頭 你有未來 你…

PHP 完整實戰23種設計模式

PHP實戰創建型模式 單例模式 工廠模式 抽象工廠模式 原型模式 建造者模式 PHP實戰結構型模式 橋接模式 享元模式 外觀模式 適配器模式 裝飾器模式 組合模式 代理模式 過濾器模式 PHP實戰行為型模式 模板模式 策略模式 狀態模式 觀察者模式 責任鏈模式 訪問者模…

Diango博客--16.穩定易用的 Django 分頁庫,完善分頁功能(二)

文章目錄0.思路引導1.分頁效果概述2.分頁思路3.Django 第三方拓展:django-pure-pagination4.自定義模板0.思路引導 1)在前面我們通過 Django Pagination 實現簡單分頁 中,我們實現了一個簡單的分頁導航。但效果有點差強人意,我們…

回歸測試

在集成測試過程中,每當一個新模塊結合進來時,程序就發生了變化:建立了新的數據流路徑,可能出現了新的I/O操作,激活了新的控制邏輯。在集成測試的范疇中,回歸測試是指重新執行已經做過的測試的某個子集&…

不同的寫法 其中 1 2 (試了下 沒有效果 ,先記載這里把)

轉載于:https://www.cnblogs.com/kaibindirver/p/9145455.html

美國西北大學 計算機工程專業排名,[轉載]美國西北大學計算機工程研究生最新專業排名...

對于打算去美國西北大學讀研究生的學生來講,美國西北大學研究生申請要求及美國西北大學研究生專業介紹是學生最關心的問題。本文香港介紹美國西北大學研究生申請要求及美國西北大學研究生的專業介紹,幫助更多的學生更好的了解美國西北大學。2016年西北大…

析構函數virtual與非virtual區別

作為通常的原則,如果一個類定義了虛函數,那么它的析構函數就應當是virtual的。因為定義了虛函數則隱含著:這個類會被繼承,并且會通過基類的指針指向子類對象,從而得到多態性。 這個類可能會被繼承,并且會…

Python:字典列表字符串方法測試

測試的一些Python中的關于字典、列表、字符串的使用方法,放在這里備查。整個測試代碼和說明如下: # -*- coding: utf-8 -*- """Python:函數中全是指針傳遞,而任何變量都是給予一個指針指向一個內存空間"""impo…

什么是確認測試

確認測試也稱為驗收測試,它的目標是驗證軟件的有效性。 通常,驗證指的是保證軟件正確地實現了某個特定要求的一系列活動;確認指的是為了保證軟件確實滿足了用戶需求而進行的一系列活動。 軟件有效性的一個簡單定義是:如果軟件的功…

Diango博客--17.統計各個分類和標簽下的文章數

文章目錄0.思路引導1.Model 回顧2.數據庫數據聚合3.使用 Annotate4.在模板中引用新增的屬性0.思路引導 在我們的博客側邊欄有分類列表和標簽列表,顯示博客已有的全部文章分類。現在想在分類名和標簽名后顯示該分類或者標簽下有多少篇文章,該怎么做呢&am…

HTTP協議中request報文請求方法和狀態響應碼

一個HTTP請求報文由4部分組成: 請求行(request line)請求頭部(header)空行請求數據下圖給出了請求報文的一般格式: 請求行中包括了請求方法,常見的請求方法有: GET:從服務…

計算機無法安裝64位操作系統,為什么我的win7旗艦版service Pack 1 64位操作系統 無法安裝(KB2670838) 這個更新...

您好!我了解到您遇到關于這邊的問題請問無法安裝是否出現了什么錯誤代碼提示呢?請參考以下的步驟解決按WindowsR打開cmd里使用下面的命令關閉相關的一些服務:net stop wuauservnet stop cryptSvcnet stop bitsnet stop msiserver完成后&#…

bmon:一個強大的網絡帶寬監視和調試工具

bmon 是類 Unix 系統中一個基于文本,簡單但非常強大的 網絡監視和調試工具,它能抓取網絡相關統計信息并把它們以用戶友好的格式展現出來。它是一個可靠高效的帶寬監視和網速估測工具。 它能使用各種輸入模塊讀取輸入,并以各種輸出模式顯示輸出…