全書分為三部分。
1.基礎(chǔ)語(yǔ)法部分介紹C#編程特性,將語(yǔ)法與實(shí)際編程框架穿插起來(lái)講解,而不是一開(kāi)始將所有的語(yǔ)法特性解釋完畢再來(lái)解釋實(shí)際應(yīng)用。
2.結(jié)合編程框架部分介紹C#使用.NET編程框架,結(jié)合基礎(chǔ)常見(jiàn)的功能進(jìn)行講解。
3.實(shí)際編程案例部分通過(guò)開(kāi)發(fā)一個(gè)分布式爬蟲(chóng)系統(tǒng)來(lái)將本書講解的所有語(yǔ)法合并到成一個(gè)實(shí)際的項(xiàng)目案例,讓讀者有一個(gè)切身的體會(huì)。
通過(guò)閱讀本書,讀者可以掌握C#編程技巧,勝任大部分一般性的服務(wù)器端開(kāi)發(fā)工作。
:(1)資深專家撰寫,注重實(shí)戰(zhàn),技術(shù)全面,一書掌握C#編程(2)以2個(gè)綜合案例貫穿全書,從語(yǔ)法到多線程/并行編程,從簡(jiǎn)單開(kāi)發(fā)到分布式系統(tǒng),示例代碼均為實(shí)戰(zhàn)所需,提供隨書代碼,拿來(lái)即用
為什么要寫這本書
C#是一門上手容易且功能強(qiáng)大的編程語(yǔ)言,支持很多編程場(chǎng)景。在很長(zhǎng)一段時(shí)間內(nèi),C#與.NET框架只能運(yùn)行在Windows平臺(tái)上,所以在移動(dòng)互聯(lián)網(wǎng)時(shí)代到來(lái)后很多公司選擇了可以在開(kāi)源Linux平臺(tái)上運(yùn)行的Java語(yǔ)言,因此很多程序員認(rèn)為C#不適合互聯(lián)網(wǎng)開(kāi)發(fā)。
隨著.NET Core平臺(tái)的發(fā)布以及微軟開(kāi)放源代碼,在Linux、macOS等系統(tǒng)上也可以運(yùn)行C#程序了,這樣就大大擴(kuò)展了C#的使用場(chǎng)景。
互聯(lián)網(wǎng)后端程序:可基于ASP.NET MVC或者ASP.NET Web API等框架開(kāi)發(fā)。
窗體程序:可基于Windows平臺(tái)的Winform和WPF等框架,Linux平臺(tái)的Mono和Avalonia等框架,以及針對(duì)macOS Visual Studio開(kāi)發(fā)。
桌游、手游等游戲程序:可基于Unity3D開(kāi)發(fā)。
物聯(lián)網(wǎng)開(kāi)發(fā):使用C#比其他編程語(yǔ)言更為便利。
人工智能編程:微軟提供了開(kāi)源的跨平臺(tái)框架ML.NET,并且提供了TensorFlow框架的開(kāi)源.NET版本。
出于對(duì).NET框架和C#的熱愛(ài),筆者決定寫一本關(guān)于C#的書。本書主要以互聯(lián)網(wǎng)后端編程的應(yīng)用場(chǎng)景為例介紹C#語(yǔ)言的各種特性,書中的示例代碼盡量只使用.NET框架實(shí)現(xiàn)。
讀者對(duì)象
本書采取由淺入深的編寫思路,適合的讀者對(duì)象包括:
零基礎(chǔ)的編程愛(ài)好者
有其他語(yǔ)言編程經(jīng)驗(yàn)的開(kāi)發(fā)工程師
中級(jí)以下C#開(kāi)發(fā)工程師
開(kāi)設(shè)相關(guān)課程的大專院校師生
本書特色
很多C#相關(guān)參考書中的代碼示例僅僅局限于要講解的知識(shí)點(diǎn),而且大多數(shù)例子非常簡(jiǎn)單,讓讀者學(xué)完后不知如何實(shí)踐,因此筆者在寫作開(kāi)始就將示例代碼與實(shí)際業(yè)務(wù)場(chǎng)景結(jié)合作為考量因素。本書主要通過(guò)高頻交易程序和交易所撮合引擎兩個(gè)示例程序來(lái)配合介紹C#編程,內(nèi)容由淺入深,示例程序的功能也是逐漸豐富的,相信會(huì)讓讀者受到啟發(fā)。
如何閱讀本書
本書共有8章,各章的主要內(nèi)容如下。
第1章介紹在Windows和Linux平臺(tái)安裝和使用.NET框架并進(jìn)行編程的方法。
第2章介紹常用的.NET框架的基本類庫(kù),讓讀者能夠配合C#的語(yǔ)法編寫一些基本的文件處理、編碼國(guó)際化等程序。
第3章通過(guò)封裝交易所接口的實(shí)際案例,介紹面向?qū)ο、依賴注入等常?jiàn)的編程思想。
第4章介紹反射技術(shù)、代碼生成和C#對(duì)動(dòng)態(tài)語(yǔ)言的支持。由于近幾年人工智能的快速發(fā)展, Python這樣的動(dòng)態(tài)語(yǔ)言受到了越來(lái)越多的關(guān)注。筆者希望通過(guò)本章內(nèi)容向讀者展示C#語(yǔ)言對(duì)動(dòng)態(tài)語(yǔ)言這種編程范式的強(qiáng)大支持。而代碼生成技術(shù)使用得當(dāng)可以大大提高開(kāi)發(fā)效率。
第5章介紹C#讀寫數(shù)據(jù)庫(kù)的方法,特別是從代碼反向生成數(shù)據(jù)庫(kù)的方法,并介紹了在后續(xù)版本迭代中自動(dòng)對(duì)數(shù)據(jù)庫(kù)結(jié)構(gòu)執(zhí)行升級(jí)、降級(jí)操作的方法。
第6章通過(guò)多線程版的高頻交易程序來(lái)介紹多線程編程、同步機(jī)制、無(wú)鎖編程等概念。
第7章主要介紹并行編程的技巧及其與多線程編程的異同。
第8章介紹如何使用消息隊(duì)列進(jìn)行簡(jiǎn)單的分布式處理,并通過(guò)一個(gè)交易所撮合引擎案例介紹分布式編程的基本技巧。
在示例代碼的頭部注釋里,筆者添加了相關(guān)的編譯和運(yùn)行命令,有一些較為復(fù)雜的配置和編譯步驟附在源碼目錄文件夾的README.md文件中。讀者可以從GitHub(https://github.com/shiyimin/csharpmagic)下載本書的示例代碼。
由于篇幅限制,筆者對(duì)原稿做了一些裁減,并會(huì)將這部分內(nèi)容上傳到GitHub倉(cāng)庫(kù),存放在名為裁減章節(jié)的文件夾中。
勘誤和支持
需要特別說(shuō)明的是,筆者開(kāi)始寫作時(shí)C#版本是7.1,完稿時(shí)C# 9.0版已經(jīng)發(fā)布了,因此本書未能及時(shí)引入C# 8.0和C# 9.0的功能特性。值得欣慰的是,C#新版本的功能在微軟的官方文檔中有詳細(xì)描述,因此新版本的發(fā)布并不影響讀者通過(guò)本書深入了解C#的豐富特性。
.NET框架的功能非常強(qiáng)大,本書只介紹了其在互聯(lián)網(wǎng)后臺(tái)進(jìn)行開(kāi)發(fā)的場(chǎng)景。對(duì)于其他編程場(chǎng)景,有興趣的讀者可以添加微信shi_yi_min(備注C#編程魔法書讀者)或發(fā)送郵件至郵箱shiyimin@vowei.com來(lái)與我一起討論。由于筆者水平有限,書中難免會(huì)出現(xiàn)一些錯(cuò)誤或者表述不準(zhǔn)確的問(wèn)題,懇請(qǐng)讀者批評(píng)指正。
致謝
從2017年12月底高婧雅編輯聯(lián)系我寫作本書開(kāi)始,到2020年12月27日完稿,本書歷時(shí)3年。感謝在這么長(zhǎng)的時(shí)間內(nèi)一直支持我的高婧雅編輯以及我的家人,特別感謝我的愛(ài)人。
謹(jǐn)以此書獻(xiàn)給我親愛(ài)的家人,以及眾多熱愛(ài)C#和.NET編程的朋友們!
資深軟件工程師和測(cè)試工程師,擁有近10年軟件行業(yè)從業(yè)經(jīng)驗(yàn),精通iOS、Android以及Windows Phone應(yīng)用程序調(diào)試、測(cè)試技術(shù)。曾經(jīng)為.NET Developer Platform部分框架代碼的提供測(cè)試服務(wù),團(tuán)隊(duì)負(fù)責(zé)的微軟開(kāi)發(fā)框架產(chǎn)品有: CLR, .NET BCL, WPF, Silverlight, ASP.NET, .NET兼容性測(cè)試。
前言
第1章快速認(rèn)識(shí)C# /1
1.1 創(chuàng)建helloworld2
1.1.1 使用文本編輯器和命令行編譯器創(chuàng)建2
1.1.2 使用Visual Studio Community創(chuàng)建5
1.1.3 helloworld源碼解讀7
1.1.4 C#腳本語(yǔ)言8
1.2 C#語(yǔ)言特性9
1.3 C#與.NET框架10
1.4 多操作系統(tǒng)支持12
1.4.1 在Ubuntu 14.04上安裝和使用.NET Core13
1.4.2 跨平臺(tái)運(yùn)行.NET Core程序14
1.4.3 在Ubuntu 14.04上安裝和使用Mono15
1.5 本章小結(jié)17
第2章C#編程基礎(chǔ) /18
2.1 字符串操作18
2.1.1 格式化字符串輸出19
2.1.2 $符號(hào):字符串內(nèi)插21
2.1.3 字符串比較22
2.1.4 修改字符串24
2.1.5 字符編碼25
2.2 正則表達(dá)式31
2.2.1 構(gòu)造分組33
2.2.2 反向引用37
2.2.3 替換38
2.3 訪問(wèn)文件40
2.3.1 文件和文件夾基本操作40
2.3.2 流處理42
2.3.3 管道45
2.3.4 內(nèi)存映射文件48
2.4 編碼國(guó)際化54
2.5 時(shí)間和日期60
2.6 本章小結(jié)63
第3章C#面向?qū)ο缶幊? /64
3.1 面向?qū)ο?4
3.1.1 RESTful編程65
3.1.2 WebSocket編程72
3.1.3 面向?qū)ο蠓庋b76
3.1.4 使用接口79
3.1.5 使用繼承81
3.2 讀寫日志86
3.2.1 使用Debug和Trace記錄日志86
3.2.2 使用第三方日志庫(kù)記錄日志92
3.2.3 使用Microsoft.Extension.Logging記錄日志96
3.2.4 記錄日志的推薦方法99
3.3 依賴注入100
3.4 配置文件108
3.4.1 .NET框架配置文件108
3.4.2 .NET Core配置文件111
3.5 程序案例117
3.6 本章小結(jié)119
第4章反射與動(dòng)態(tài)編程 /120
4.1 反射120
4.1.1 獲取類型信息121
4.1.2 動(dòng)態(tài)加載125
4.1.3 序列化128
4.1.4 使用特性132
4.1.5 版本控制140
4.2 代碼生成和動(dòng)態(tài)執(zhí)行146
4.2.1 CodeDOM生成源碼147
4.2.2 Reflection.Emit152
4.2.3 IL語(yǔ)言157
4.2.4 多模塊組裝件161
4.3 dynamic關(guān)鍵字163
4.4 動(dòng)態(tài)語(yǔ)言運(yùn)行時(shí)166
4.4.1 IronPython166
4.4.2 DLR170
4.5 本章小結(jié)172
第5章數(shù)據(jù)處理編程 /173
5.1 ADO.NET175
5.1.1 使用ODBC連接數(shù)據(jù)源178
5.1.2 在線讀寫數(shù)據(jù)181
5.2 Lambda和LINQ187
5.2.1 匿名方法和Lambda表達(dá)式188
5.2.2 本地方法191
5.3 LINQ195
5.3.1 LINQ to Object195
5.3.2 LINQ to SQL和Entity Framework Core198
5.3.3 LINQ部分源碼解讀201
5.3.4 可空引用類型205
5.4 Entity Framework208
5.4.1 使用EF Code First構(gòu)建和映射數(shù)據(jù)庫(kù)208
5.4.2 使用EF遷移數(shù)據(jù)庫(kù)212
5.4.3 EF對(duì)關(guān)系的映射216
5.4.4 EF的性能考量220
5.5 本章小結(jié)224
第6章多線程編程 /225
6.1 多線程編程基礎(chǔ)225
6.1.1 創(chuàng)建和使用多線程226
6.1.2 使用線程池227
6.2 多線程同步229
6.2.1 阻塞式等待229
6.2.2 鎖231
6.2.3 信號(hào)242
6.2.4 屏障246
6.3 主動(dòng)取消等待249
6.3.1 在線程中主動(dòng)響應(yīng)取消請(qǐng)求250
6.3.2 統(tǒng)一的取消任務(wù)等待操作251
6.4 其他多線程元素254
6.4.1 Lazy254
6.4.2 線程本地存儲(chǔ)256
6.4.3 定時(shí)器259
6.5 無(wú)鎖編程260
6.5.1 內(nèi)存屏障和volatile關(guān)鍵字260
6.5.2 使用無(wú)鎖編程261
6.6 本章小結(jié)263
第7章并行編程 /264
7.1 并行編程基礎(chǔ)264
7.1.1 使用Task類型實(shí)現(xiàn)并行264
7.1.2 使用Parallel.For實(shí)現(xiàn)并行268
7.2 硬件特性270
7.2.1 內(nèi)存訪問(wèn)順序271
7.2.2 偽共享272
7.3 基于數(shù)據(jù)并行275
7.3.1 Parallel.For和Parallel.ForEach275
7.3.2 跳出循環(huán)278
7.4 基于任務(wù)的并行280
7.4.1 網(wǎng)絡(luò)異步編程的適用場(chǎng)景280
7.4.2 使用連續(xù)任務(wù)281
7.4.3 Thread.Sleep和Task.Delay的區(qū)別284
7.5 async和await關(guān)鍵字286
7.5.1 使用async和await異步編程286
7.5.2 使用狀態(tài)機(jī)實(shí)現(xiàn)async方法288
7.5.3 async方法實(shí)現(xiàn)機(jī)制292
7.5.4 擴(kuò)展async方法296
7.5.5 async方法執(zhí)行上下文296
7.6 函數(shù)式編程298
7.6.1 函數(shù)式編程簡(jiǎn)介298
7.6.2 高階方法299
7.6.3 偏函數(shù)應(yīng)用300
7.6.4 柯里化方法301
7.6.5 數(shù)據(jù)封裝302
7.6.6 錯(cuò)誤處理304
7.6.7 模式匹配305
7.7 本章小結(jié)308
第8章分布式編程 /309
8.1 C#對(duì)分布式編程的支持309
8.1.1 Web服務(wù)技術(shù)310
8.1.2 Remoting技術(shù)311
8.1.3 RESTful API312
8.1.4 gRPC313
8.2 分布式系統(tǒng)舉例323
8.2.1 消息隊(duì)列324
8.2.2 ZeroMQ325
8.2.3 系統(tǒng)架構(gòu)334
8.2.4 交易