<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          學(xué)習(xí)C#之前必須掌握這些

          共 3968字,需瀏覽 8分鐘

           ·

          2020-10-26 18:13

          1

          概念和基礎(chǔ)

          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的

          2

          C#核心:屬性、委托、泛型

          在了解了屬性、委托、泛型這三種最基礎(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


          瀏覽 122
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产丨在线 | 97Av电影手机版 | 特级AV免费在线观看 | 97男人的天堂 | 免费观看在线Aⅴ播放 |