學(xué)習(xí)C#之前必須掌握這些
Why Java or C#:
在當(dāng)前市場上,使用到的編程語言,排名前五位的分別為:Java、C、C++、Python、C#。而在大型應(yīng)用開發(fā)層面上Java和C#仍然是開發(fā)人員的首選,當(dāng)然Python這兩年奮起直追,但Python的設(shè)計(jì)思路和C#、Java并不相同,所以就暫是拋開Python不提了(Python粉不要拍磚,我也喜歡Python)。
Win10推出之后,開發(fā)市場上,windows平臺上開發(fā)應(yīng)用又回光返照了一陣子,且如果要做一些需要大量本地計(jì)算的Windows應(yīng)用開發(fā),C# + .NET仍然是一個(gè)非常不錯(cuò)甚至是唯一的選擇。
按照語言運(yùn)行環(huán)境分類的不同,我把這五大巨頭分成了兩類,如下:
托管Runtime類型語言:
Java——JRE(Java虛擬機(jī)和核心類庫)
Python——Python解釋器
C#——CLR(.NET Framework)
非托管類型語言:
C、C++——編譯后直接執(zhí)行機(jī)器語言
可以看到,五大巨頭中過半的語言使用了構(gòu)建在Runtime之上的設(shè)計(jì)架構(gòu),無論它是叫虛擬機(jī)也好,解釋器也好,個(gè)人覺得它們的目的是以下兩個(gè)
平臺無關(guān)性
開發(fā)的便利性和安全性
多幾句廢話:
如果能夠掌握了C#的設(shè)計(jì)思想,那么基本上也就認(rèn)識了老大Java,原因就是由于C#推出的目的有很大的成分是微軟用來對抗Java的,但跨平臺和開源盛行的今天,微軟每推出一項(xiàng)技術(shù),得到的結(jié)果基本上都是叫好不叫座,C#這么多年了,不溫不火,TypeScript也是同樣的情況。移動平臺上的Xamarin使用的人也是寥寥無幾。一個(gè)語言或者框架的發(fā)展都是離不開社區(qū)的,微軟應(yīng)該反省。
那么如果選用C#在Windows下進(jìn)行開發(fā)后,那么就需要了解C#的基本特性以及需要明確一個(gè)學(xué)習(xí)路徑,有非常多的C#入門文章,一上來就去扯什么值類型、引用類型,裝箱、拆箱等這些偏于底層的基礎(chǔ)概念,浪費(fèi)了新手大量的入門時(shí)間。所以我覺得,這些知識在使用一段時(shí)間C#之后,再去熟悉,即能夠深刻理解時(shí)機(jī)上也不晚。
PS.這篇文章編寫的前提是要求讀者至少了解面向?qū)ο笏枷?,使用過一段時(shí)間C++ 是最好的,如果不了解C++的話,最好先找一本基礎(chǔ)讀物了解一下,個(gè)人推薦《大話設(shè)計(jì)模式》這本書的附錄部分,它對C#的基礎(chǔ)知識做了非常直白的描述。
1.1
了解C#的基礎(chǔ)生態(tài)
1.1.1 .NETFrameWork
.NETFrameWork是微軟的基礎(chǔ)生態(tài)

挑幾個(gè)重要的說說:
1.1.2 COM組件與.NET組件(上圖第三層)
COM組件和.NET組件都是幫助應(yīng)用程序可以在windows平臺上運(yùn)行的底層接口。
利用COM組件,可以實(shí)現(xiàn)非托管代碼(C/C++)程序和托管代碼(CLR程序)的交互
.NET是在基于COM組件的基礎(chǔ)上發(fā)展而來的,是微軟為了實(shí)現(xiàn)跨平臺運(yùn)行而推出的,也就是安裝了. NET FrameWork的電腦都可以正常運(yùn)行,而基于COM開發(fā)的程序,只能運(yùn)行在Windows平臺中
我本人到目前為止還沒有真正利用. NET框架真正開發(fā)過跨平臺的應(yīng)用,雖然. NET框架包含了COM組件,但是我覺得如果想要開發(fā)跨平臺的應(yīng)用,還是盡量避免使用COM組件,但是如果只在Windows平臺上運(yùn)行,則無需擔(dān)心這點(diǎn)
1.1.3 CLR(上圖第四層)
CLR(公共語言運(yùn)行庫 Common Language Runtime)類似于Java虛擬機(jī),是可以讓編譯出來(IL中間語言)的托管代碼運(yùn)行在各個(gè)平臺的運(yùn)行時(shí)庫。
它的職責(zé)是:
負(fù)責(zé)資源管理和垃圾收集等等工作
保證底層系統(tǒng)和應(yīng)用之間必要的分離
說明下什么是托管代碼和非托管代碼
托管代碼:Microsoft的中間語言(IL),作用于CLR
主要作用在 .NET Framework的CLR編譯,只要是CLR編譯器編譯出來的程序集,就能夠在安裝有CLR程序的電腦中運(yùn)行,目前應(yīng)用CLR最為廣泛的語言:C#、VB、F#、Iron Python、Ruby等等
IL通過JIT最終變?yōu)闄C(jī)器語言
非托管代碼:CLR誕生之前,那些只能在同一個(gè)系統(tǒng)中運(yùn)行的代碼,即C\C++(去想想交叉編譯鏈多復(fù)雜吧)
注:托管、非托管代碼和托管非托管資源不是一回事兒,托管、非托管資源會在GC垃圾回收機(jī)制中進(jìn)行說明
什么是JIT
JIT(即時(shí)編譯 Just In Time),是.NET運(yùn)行可執(zhí)行程序的基本方式。雖然在上圖中,并沒有體現(xiàn)出JIT,但是剛剛說了,運(yùn)行的是一種中間語言即IL,而JIT編譯器干的事情就是輸入IL,輸出的是機(jī)器語言。也就是說,只有當(dāng)需要的時(shí)候,JIT即時(shí)編譯器才會將之前編譯好的中間語言轉(zhuǎn)換為機(jī)器語言
1.1.4 框架類庫FCL(上圖第五層)
在C#開發(fā)過程中,可以用到大量的微軟為我們提供的框架類庫
基礎(chǔ)類庫BCL
Base Class Library的縮寫,這里提供了一個(gè)綜合性的面向?qū)ο罂芍赜妙愋图?。舉個(gè)例子,在開發(fā)過程中,使用的string、List容器等等等都出自BCL
WCF
Windows Communication Foundation(Windows通信開發(fā)平臺),整合了原有的Windows通信的WebService、Socket、HTTP、FTP等。是.NETFramework中的SOA。通俗一點(diǎn)的理解,可以認(rèn)為WCF是一個(gè)數(shù)據(jù)的搬運(yùn)工,是一種連接各個(gè)系統(tǒng)的強(qiáng)大方式
WPF/UWP
這兩項(xiàng)技術(shù)脫胎于經(jīng)典的WinForm,但是從底層來看,兩者沒有任何聯(lián)系,WFP的推出是微軟用來取代WinForm的,有關(guān)于在Windows上開發(fā)界面的框架,發(fā)展線路可以歸結(jié)為:WinForm->WPF->UWP。
在WPF中,微軟開發(fā)了一套類似HTML + CSS 一樣的XAML語言,使得界面與后端解耦和
WPF是調(diào)用的圖形接口是DirectX9.0,所以運(yùn)行WPF程序,需要電腦顯卡在硬件上至少支持DX9
UWP是微軟針對Win10系統(tǒng),基于WPF擴(kuò)展而來的,不僅可以使用XAML語言,還可以使用HTML和JavaScript進(jìn)行Windows界面的開發(fā)
ADO. NET\SQL
如果是一套業(yè)務(wù)系統(tǒng)程序,那么一定會涉及到數(shù)據(jù)庫開發(fā),這個(gè)就會用到微軟為我們提供的ADO. NET程序集
1.1.5 CTS和CLS(上圖第六層)
這兩個(gè)不必深究,就是兩個(gè)標(biāo)準(zhǔn),使用過程中會很自然的用到。
CTS(Common Type System)通用類型系統(tǒng),諸如類型的屬性、方法、public,private訪問權(quán)限,都是出自這個(gè)標(biāo)準(zhǔn)
CLS(Common Language Specification)公共語言規(guī)范,在編譯程序的時(shí)候,編譯器為我們返回的很多警告,都是來自于CLS的
在了解了屬性、委托、泛型這三種最基礎(chǔ)的用法,那么在后續(xù)使用C#的過程中,剩下的就是去了解FCL為我們提供的各種各樣的類型了,因?yàn)檫@些類型無外乎通過這三種方式為我們暴露接口
2.1
有關(guān)屬性
推薦的C#編程原則:使用屬性代替成員變量
C#通過控制成員變量的屬性的訪問入口,即Get、Set來控制類型的成員變量
屬性帶來的好處:
使用屬性暴露對外接口,同時(shí)可以使用屬性限制訪問權(quán)限
設(shè)置只讀、只寫屬性
檢查數(shù)據(jù)是否正確(比如年齡不能小于0)
使用屬性在客戶端訪問或設(shè)置成員的時(shí)候,能夠產(chǎn)生一些副作用
例如記錄緩存、日志
在屬性的get\set方法中檢測數(shù)據(jù)安全、線程安全等
等等
2.2
有關(guān)委托
委托的實(shí)際其實(shí)就是一個(gè)函數(shù)指針,在.NET中有相當(dāng)多現(xiàn)成的委托方法可直接使用,這些委托被應(yīng)用在了很多常用類型的方法當(dāng)中。靈活應(yīng)用這些.NET委托可以實(shí)現(xiàn)回調(diào)機(jī)制、事件機(jī)制等等,這些機(jī)制都為代碼設(shè)計(jì)的解耦和、減輕代碼量提供了很好的解決方案。
以下是幾個(gè)常用官方委托:

舉個(gè)例子體會一下
在很多最為基礎(chǔ)的BCL類型當(dāng)中,比如List容器類型,都會大量的使用到委托,可以據(jù)一個(gè)例子體驗(yàn)一下委托的用法:
比如FindAll方法:在容器當(dāng)中尋找符合特定條件的對象。而這種條件是需要程序員自定義的,而這個(gè)定義就是一個(gè)委托(即程序員“委托”List的FindAll方法,幫我找出符合我提出條件的對象)
可以使用至少三種的委托方法去實(shí)現(xiàn)這個(gè)委托功能:
-----實(shí)現(xiàn)方法一:自定義委托或框架提供的委托(例子來自MSDN)

-----實(shí)現(xiàn)方法二:匿名函數(shù)
這種實(shí)現(xiàn)方法與普通委托一樣,但是更加便捷,不用單獨(dú)聲明

-----實(shí)現(xiàn)方法三:lambda表達(dá)式
C#3.0引入了lambda表達(dá)式,Lambda表達(dá)式實(shí)際上也是一個(gè)委托
下邊這個(gè)例子可以看出,lambda表達(dá)式又減少了一部分代碼量,且可讀性也更加清晰,但并沒有體現(xiàn)出跨越式的優(yōu)點(diǎn)

以下例子是直接使用lambda表達(dá)式到迭代器中,更加直接的體現(xiàn)出lambda表達(dá)式的優(yōu)勢,也減少了沒有必要的代碼量

2.3
有關(guān)泛型
泛型在使用上像極了C++當(dāng)中的模板,在C#當(dāng)中,泛型有以下幾點(diǎn)好處
避免了強(qiáng)制類型轉(zhuǎn)換帶來的裝箱拆箱。在BCL中,微軟也提供了大量現(xiàn)成的泛型類,比如使用最為廣泛的List
可以實(shí)現(xiàn)一種代碼重用機(jī)制:“算法重用”,比如開發(fā)人員定義的排序算法并不需要指定某種類型,而是讓調(diào)用這個(gè)算法的開發(fā)人員去指定類型
泛型的種類:
泛型類型
泛型接口
泛型委托
泛型方法
一個(gè)有關(guān)于泛型的典型例子就是有利用泛型定義一個(gè)鏈表,這個(gè)鏈表可以存儲任意類型的數(shù)據(jù):


作者:來源于網(wǎng)絡(luò)
出處:微信公眾號“新閣Net社區(qū)”
鏈接:https://mp.weixin.qq.com/s/XgQbIw3HkTlWXpR9CCUfgA
