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