- 相關(guān)推薦
淺談C#語言的特點
C#是微軟公司發(fā)布的一種由C和C++衍生出來的面向?qū)ο蟮木幊陶Z言、運行于.NET Framework和.NET Core(完全開源,跨平臺)之上的高級程序設計語言。小編帶來的淺談C#語言的特點。
Microsoft.NET(以下簡稱.NET)框架是微軟提出的新一代Web軟件開發(fā)模型,C#語言是.NET框架中新一代的開發(fā)工具。C#語言是一種現(xiàn)代、面向?qū)ο蟮恼Z言,它簡化了C++語言在類、命名空間、方法重載和異常處理等方面的操作,它摒棄了C++的復雜性,更易使用,更少出錯。它使用組件編程,和VB一樣容易使用。C#語法和C++和JAVA語法非常相似,如果讀者用過C++和JAVA,學習C#語言應是比較輕松的。
用C#語言編寫的源程序,必須用C#語言編譯器將C#源程序編譯為中間語言(MicroSoft Intermediate Language,MSIL)代碼,形成擴展名為exe或dll文件。中間語言代碼不是CPU可執(zhí)行的機器碼,在程序運行時,必須由通用語言運行環(huán)境(Common Language Runtime,CLR)中的既時編譯器(JUST IN Time,JIT)將中間語言代碼翻譯為CPU可執(zhí)行的機器碼,由CPU執(zhí)行。CLR為C#語言中間語言代碼運行提供了一種運行時環(huán)境,C#語言的CLR和JAVA語言的虛擬機類似。這種執(zhí)行方法使運行速度變慢,但帶來其它一些好處,主要有:
通用語言規(guī)范(Common Language Specification,CLS):.NET系統(tǒng)包括如下語言:C#、C++、VB、J#,他們都遵守通用語言規(guī)范。任何遵守通用語言規(guī)范的語言源程序,都可編譯為相同的中間語言代碼,由CLR負責執(zhí)行。只要為其它操作系統(tǒng)編制相應的CLR,中間語言代碼也可在其它系統(tǒng)中運行。
自動內(nèi)存管理:CLR內(nèi)建垃圾收集器,當變量實例的生命周期結(jié)束時,垃圾收集器負責收回不被使用的實例占用的內(nèi)存空間。不必象C和C++語言,用語句在堆中建立的實例,必須用語句釋放實例占用的內(nèi)存空間。也就是說,CLR具有自動內(nèi)存管理功能。
交叉語言處理:由于任何遵守通用語言規(guī)范的語言源程序,都可編譯為相同的中間語言代碼,不同語言設計的組件,可以互相通用,可以從其它語言定義的類派生出本語言的新類。由于中間語言代碼由CLR負責執(zhí)行,因此異常處理方法是一致的,這在調(diào)試一種語言調(diào)用另一種語言的子程序時,顯得特別方便。
增加安全:C#語言不支持指針,一切對內(nèi)存的訪問都必須通過對象的引用變量來實現(xiàn),只允許訪問內(nèi)存中允許訪問的部分,這就防止病毒程序使用非法指針訪問私有成員。也避免指針的誤操作產(chǎn)生的錯誤。CLR執(zhí)行中間語言代碼前,要對中間語言代碼的安全性,完整性進行驗證,防止病毒對中間語言代碼的修改。
版本支持:系統(tǒng)中的組件或動態(tài)聯(lián)接庫可能要升級,由于這些組件或動態(tài)聯(lián)接庫都要在注冊表中注冊,由此可能帶來一系列問題,例如,安裝新程序時自動安裝新組件替換舊組件,有可能使某些必須使用舊組件才可以運行的程序,使用新組件運行不了。在.NET中這些組件或動態(tài)聯(lián)接庫不必在注冊表中注冊,每個程序都可以使用自帶的組件或動態(tài)聯(lián)接庫,只要把這些組件或動態(tài)聯(lián)接庫放到運行程序所在文件夾的子文件夾bin中,運行程序就自動使用在bin文件夾中的組件或動態(tài)聯(lián)接庫。由于不需要在注冊表中注冊,軟件的安裝也變得容易了,一般將運行程序及庫文件拷貝到指定文件夾中就可以了。
完全面向?qū)ο螅翰幌驝++語言,即支持面向過程程序設計,又支持面向?qū)ο蟪绦蛟O計,C#語言是完全面向?qū)ο蟮,在C#中不再存在全局函數(shù)、全區(qū)變量,所有的函數(shù)、變量和常量都必須定義在類中,避免了命名沖突。C#語言不支持多重繼承。
算法例子:
質(zhì)因數(shù)分解算法
我們通過這個算法例子來簡單弄明白各語言之間的差異,以下給出的是部分實現(xiàn)代碼,更詳細代碼需要查看源文件。
首先什么是質(zhì)因數(shù)分解算法?即任意一個合數(shù)可以分解為多個質(zhì)數(shù)相乘。
例如:20 = 2 * 2 * 5; 45 = 3 * 3 * 5; 210 = 2 * 3 * 5 * 7
按數(shù)學運算:列豎式或左右分解,拿能被整除的最小的質(zhì)數(shù)做除數(shù),不斷整除得到新的得數(shù),最后把所有的除數(shù)和最后的得數(shù)連起來就是。
質(zhì)因數(shù)分解
代碼實現(xiàn)思路:
先設立一個除數(shù),從最小的質(zhì)數(shù)開始,也就是2;
當能夠被當前除數(shù)整除時,該除數(shù)就是因數(shù),將原數(shù)字設為被整除后的結(jié)果;
繼續(xù)從該除數(shù)開始整除新的結(jié)果,并不斷循環(huán);
當無法被整除時,則遞增得到新的除數(shù),繼續(xù)第2步;
直到除數(shù)的平方大于要分解的值,終止循環(huán)。 最后所有的除數(shù)與剩下的大于1的那個得數(shù)就是分解結(jié)果。
各種編程語言的比較:
一、C語言
C語言是面向過程的靜態(tài)編譯型語言,也是一切高級語言的鼻祖,可以說如今幾乎所有流行的語言都有C語言的影子。C語言在底層開發(fā),包括操作系統(tǒng)、驅(qū)動、中間件、圖形庫、數(shù)據(jù)庫、網(wǎng)絡庫等開發(fā)等有著無可替代的作用。
C語言的生命力也是最長的,流行了近50年,至今還是開發(fā)排行榜前3的位置。C語言足夠簡潔清晰,沒有那么多概念,也沒有那么多API,性能極好,它是所有編程人員都應該掌握的語言,可以作為計算機基礎來學。
C語言代碼實現(xiàn)如下,該factorize可以返回一個分解后的數(shù)組。從代碼里可以看出,首先需要申請一個動態(tài)數(shù)組result,長度為len的內(nèi)存空間。該數(shù)組用來保存分解數(shù),每分解出一個數(shù)字時則追加到數(shù)組中去,數(shù)組下標也隨之增加。當分解完成后,最后返回分解數(shù)的數(shù)組。
代碼邏輯:
建立雙循環(huán),自最小的質(zhì)數(shù)2開始不斷遞增遍歷。
外層循環(huán)為是否繼續(xù)分解的條件,當i的乘方小于等于要分解的數(shù)字時,說明還可以分解。i不斷遞增,直到i的平方大于num為止。
內(nèi)循環(huán)則不斷用num來除以約數(shù),看能否除盡,能除盡則以得數(shù)作為新的num來繼續(xù)分解,并將剛才的除數(shù)i追加到分解結(jié)果中。當i無法整除num時,說明當前i分解完成,則跳出內(nèi)循環(huán)。
當循環(huán)終止后,最后分解的得數(shù)如果小于i的平方就沒法繼續(xù)分解,如果i大于1那剩下的num就是最后一個分解數(shù)。
二、C++語言
C++語言是C語言的超集,它擴充和完善了C語言。增加了類的概念,并引進了運算符重載、引用、虛函數(shù)等。C++做什么都離不開對象和類,其核心思想是多態(tài),繼承,封裝。C++的語法與C幾乎一致,基本上C的代碼可以在C++下運行,但是C++比C語言要復雜和更難掌握,相對來講C更加清晰易懂。
由于C語言相對簡單,且是過程式,開發(fā)大型復雜系統(tǒng)或者大型軟件界面時會力不從心,于是C++應運而生。其實我并不覺得C++比C好或強大,大型系統(tǒng)完全可以通過自己組織代碼來得到良好架構(gòu),也有很多單獨C語言UI庫。
C++的生命力也很強大,幾乎是很多中大型系統(tǒng)、游戲、桌面軟件、服務端、網(wǎng)絡通信等的首選語言,至今也在開發(fā)排行榜前5的位置。
這里C++代碼實現(xiàn)與C語言一致,因為沒有用到面向?qū)ο,所以沒有任何區(qū)別。其他差異可以從github倉庫里查看。
三、Java語言
Java語言發(fā)明于上世紀90年代,由Sun公司推出,后被Oracle收購。Java是一門面向?qū)ο缶幊陶Z言,吸收了C++的各種優(yōu)點,但放棄了C++里難以理解的多繼承、指針等概念。同時提供了垃圾自動回收的能力,程序員再也不用手動釋放內(nèi)存了。
Java的語法與C基本一致,除了增加了類以及集合相關(guān)的概念。Java主要面向的領域是后臺開發(fā)、中間件開發(fā)、Android開發(fā)、大數(shù)據(jù)開發(fā)等,目前Java是編程排行榜排名第一的語言,非常流行,作為入門學習語言非常不錯。不過由于設計的過于嚴謹刻板導致有些臃腫,目前已有下滑的跡象。后起之秀Go、Kotlin、NodeJS、Dart無不在蠶食Java的地盤。
相信不久的將來,Java開發(fā)排行榜老大的地位將面臨很大的挑戰(zhàn)。跟Java非常像的是它的老對手C#,這個語言在Windows環(huán)境下那是絕對的老大,但可惜在Linux以及Mac、iOS、Android等系統(tǒng)下,C#幾乎無人問津。Java地位岌岌可危,但C#進化得不錯,前景很好,這里不再贅述。
這里Java版使用了ArrayList,是長度可變的列表,相比C語言使用數(shù)組來講要方便些。代碼上基本一樣,如果也使用int數(shù)組,那代碼就幾乎一樣了。Java里一切都是以Class為基礎,所有內(nèi)容都必須放在Class內(nèi),方法(函數(shù))、屬性(變量)不能獨立于外。
四、JavaScript語言
JavaScript是網(wǎng)景公司在90年代不經(jīng)意間發(fā)明的一種語言,起初是為了解決瀏覽器內(nèi)交互的問題。最初的名字是LiveScript,但當時Java剛剛推出,因為從語法上也參考了Java,因此就借鑒了Java的名字,改為JavaScript。但實際上它的語言本質(zhì)更接近Self及Scheme,JavaScript是一門基于對象的函數(shù)式動態(tài)編程語言。它非常靈活,語法越來越完善,看起來非常簡單,但是要想真的搞明白原理,卻并不容易。
中國有句話叫“無心插柳柳成蔭”,這句話用在JavaScript身上再合適不過了。JavaScript博采眾長,吸收了Self、Scheme、Java、C等語言的優(yōu)勢,目前已經(jīng)發(fā)展成為全球使用人數(shù)最多的編程語言,在開發(fā)排行榜上也在不斷攀升。
JavaScript是弱類型語言,其數(shù)組不限類型,也無需指定長度,使用起來非常簡單易懂。整個代碼寫法與Java也非常像,只不過簡潔了許多。
JavaScript除了獨占瀏覽器編程之外,在后臺開發(fā)、移動開發(fā)、桌面開發(fā)、嵌入式開發(fā)等領域均有所發(fā)揮,可以說未來不可限量。甚至有人說凡是可以用JavaScript實現(xiàn)的應用,最終都會用JavaScript實現(xiàn)。
五、TypeScript語言
Typescript是微軟在2012年推出的基于JavaScript的一個變種或者稱之為超集語言,完全兼容JavaScript,最后會編譯成JS來執(zhí)行。它主要增加了強類型和增強了面向?qū)ο,集成了接口和Type等概念,寫法上與JS幾無差異,有點類似于C++之于C的感覺。
TypeScript的發(fā)展態(tài)勢也很好,在使用大型工程時,強類型和面向?qū)ο蟮拇_有些好處。隨著前端工程越來越龐大,TypeScript也越來越受到歡迎。只是TypeScript由微軟開發(fā),而JS來自ECMA這個國際化標準組織。
且JavaScript正在不斷發(fā)展變化,也在不斷增加TS的那些語法糖。存在一個可能是將來有一天JS跟TS非常接近,甚至完全一致,那時候TS可能面臨退出編程舞臺。但JS或許并不一定會那么發(fā)展,因為那跟靈活多變的動態(tài)思路有悖。
因此TypeScript并不適合作為入門學習語言,而是在已經(jīng)比較熟悉JavaScript的基礎上再來學習TypeScript會比較好。
六、Python語言
Python是支持面向?qū)ο蠛兔嫦蜻^程,也支持函數(shù)式編程的解釋型編程語言,它在語法風格上也屬于C語言系。但它與其他語言所不同的是采用縮進來表示包含關(guān)系,而不是花括號。喜歡這種風格的人對此愛得要命,不喜歡的人則反感至極。
從語言特性上來講,可以說Python與JS最為接近,既可以采用面向?qū)ο,也可以采用函?shù)式。它與Java不同,沒有變量類型聲明關(guān)鍵詞,方法也可以脫離于類存在。Python總體上是一個強類型語言(但因為無需明確變量類型,以及存在自動類型轉(zhuǎn)換,所以也不是嚴格意義的強類型)。
看Python代碼,可以說是最簡單明了,最易懂。與JavaScript一樣,Python也是動態(tài)腳本語言,列表(數(shù)組)也是動態(tài)可變的,其列表操作非常好用。Python很適合新手學習,因為簡單,同時含括了編程的幾乎所有概念。
Python自90年代推出,早期為增強Shell腳本,后來發(fā)展為Web后臺語言,一直不溫不火,后來隨著大數(shù)據(jù)和人工智能的流行,Python在這兩個領域里大放光彩,未來前景非常好,是最值得推薦學習的入門語言。
看下Python的代碼量是否最少(跟JS差不多),也最好懂?
七、Go語言
Go語言是靜態(tài)編譯強類型語言,由Google于2009年推出,其初衷是替代C語言做系統(tǒng)開發(fā),但目前來看更多是替代Java做服務端開發(fā)。其語法風格與C十分接近,在C語言基礎上增加了內(nèi)存安全和垃圾自動回收功能。
Go語言不以類為依賴,語言非常簡練,語法風格上是C和JS的混合體,變量聲明是var,數(shù)組空間需要提前申請,無需括號和分號。從這段代碼來看與C語言差異不大,本質(zhì)上是C的變體。
Go語言目前在微服務和云原生領域頗受歡迎,在高并發(fā)、高可用Web應用中發(fā)揮著良好的作用,這部分有取代Java的趨勢。Go語言在分布式系統(tǒng)、網(wǎng)絡編程領域表現(xiàn)良好,目前最流行的容器編排系統(tǒng)Kubernetes就是Go語言編寫,未來更多云原生應用會逐漸采用Go語言。
Go作為新貴,這幾年開始在服務端大放異彩,因此如果您是新一代的開發(fā)者,那么跳過C++和Java,直接學習Go也是值得推薦的?聪翯o的代碼風格,您感覺舒服嗎?我感覺比起Java好一些。
【淺談C#語言的特點】相關(guān)文章:
淺談JAVA語言特點10-11
用C#語言中的修飾符07-22
用C#語言獲取CPU利用率06-24
Java語言的特點07-16
C語言的語言特點08-18
ruby語言跟c#的一些重要差別06-16
Java語言的特點分析09-29
Java語言特點07-10
Java語言的編程特點03-18