全書分為三部分。
1.基礎(chǔ)語法部分介紹C#編程特性,將語法與實際編程框架穿插起來講解,而不是一開始將所有的語法特性解釋完畢再來解釋實際應(yīng)用。
2.結(jié)合編程框架部分介紹C#使用.NET編程框架,結(jié)合基礎(chǔ)常見的功能進(jìn)行講解。
3.實際編程案例部分通過開發(fā)一個分布式爬蟲系統(tǒng)來將本書講解的所有語法合并到成一個實際的項目案例,讓讀者有一個切身的體會。
通過閱讀本書,讀者可以掌握C#編程技巧,勝任大部分一般性的服務(wù)器端開發(fā)工作。
:(1)資深專家撰寫,注重實戰(zhàn),技術(shù)全面,一書掌握C#編程(2)以2個綜合案例貫穿全書,從語法到多線程/并行編程,從簡單開發(fā)到分布式系統(tǒng),示例代碼均為實戰(zhàn)所需,提供隨書代碼,拿來即用
為什么要寫這本書
C#是一門上手容易且功能強(qiáng)大的編程語言,支持很多編程場景。在很長一段時間內(nèi),C#與.NET框架只能運行在Windows平臺上,所以在移動互聯(lián)網(wǎng)時代到來后很多公司選擇了可以在開源Linux平臺上運行的Java語言,因此很多程序員認(rèn)為C#不適合互聯(lián)網(wǎng)開發(fā)。
隨著.NET Core平臺的發(fā)布以及微軟開放源代碼,在Linux、macOS等系統(tǒng)上也可以運行C#程序了,這樣就大大擴(kuò)展了C#的使用場景。
互聯(lián)網(wǎng)后端程序:可基于ASP.NET MVC或者ASP.NET Web API等框架開發(fā)。
窗體程序:可基于Windows平臺的Winform和WPF等框架,Linux平臺的Mono和Avalonia等框架,以及針對macOS Visual Studio開發(fā)。
桌游、手游等游戲程序:可基于Unity3D開發(fā)。
物聯(lián)網(wǎng)開發(fā):使用C#比其他編程語言更為便利。
人工智能編程:微軟提供了開源的跨平臺框架ML.NET,并且提供了TensorFlow框架的開源.NET版本。
出于對.NET框架和C#的熱愛,筆者決定寫一本關(guān)于C#的書。本書主要以互聯(lián)網(wǎng)后端編程的應(yīng)用場景為例介紹C#語言的各種特性,書中的示例代碼盡量只使用.NET框架實現(xiàn)。
讀者對象
本書采取由淺入深的編寫思路,適合的讀者對象包括:
零基礎(chǔ)的編程愛好者
有其他語言編程經(jīng)驗的開發(fā)工程師
中級以下C#開發(fā)工程師
開設(shè)相關(guān)課程的大專院校師生
本書特色
很多C#相關(guān)參考書中的代碼示例僅僅局限于要講解的知識點,而且大多數(shù)例子非常簡單,讓讀者學(xué)完后不知如何實踐,因此筆者在寫作開始就將示例代碼與實際業(yè)務(wù)場景結(jié)合作為考量因素。本書主要通過高頻交易程序和交易所撮合引擎兩個示例程序來配合介紹C#編程,內(nèi)容由淺入深,示例程序的功能也是逐漸豐富的,相信會讓讀者受到啟發(fā)。
如何閱讀本書
本書共有8章,各章的主要內(nèi)容如下。
第1章介紹在Windows和Linux平臺安裝和使用.NET框架并進(jìn)行編程的方法。
第2章介紹常用的.NET框架的基本類庫,讓讀者能夠配合C#的語法編寫一些基本的文件處理、編碼國際化等程序。
第3章通過封裝交易所接口的實際案例,介紹面向?qū)ο、依賴注入等常見的編程思想?br />第4章介紹反射技術(shù)、代碼生成和C#對動態(tài)語言的支持。由于近幾年人工智能的快速發(fā)展, Python這樣的動態(tài)語言受到了越來越多的關(guān)注。筆者希望通過本章內(nèi)容向讀者展示C#語言對動態(tài)語言這種編程范式的強(qiáng)大支持。而代碼生成技術(shù)使用得當(dāng)可以大大提高開發(fā)效率。
第5章介紹C#讀寫數(shù)據(jù)庫的方法,特別是從代碼反向生成數(shù)據(jù)庫的方法,并介紹了在后續(xù)版本迭代中自動對數(shù)據(jù)庫結(jié)構(gòu)執(zhí)行升級、降級操作的方法。
第6章通過多線程版的高頻交易程序來介紹多線程編程、同步機(jī)制、無鎖編程等概念。
第7章主要介紹并行編程的技巧及其與多線程編程的異同。
第8章介紹如何使用消息隊列進(jìn)行簡單的分布式處理,并通過一個交易所撮合引擎案例介紹分布式編程的基本技巧。
在示例代碼的頭部注釋里,筆者添加了相關(guān)的編譯和運行命令,有一些較為復(fù)雜的配置和編譯步驟附在源碼目錄文件夾的README.md文件中。讀者可以從GitHub(https://github.com/shiyimin/csharpmagic)下載本書的示例代碼。
由于篇幅限制,筆者對原稿做了一些裁減,并會將這部分內(nèi)容上傳到GitHub倉庫,存放在名為裁減章節(jié)的文件夾中。
勘誤和支持
需要特別說明的是,筆者開始寫作時C#版本是7.1,完稿時C# 9.0版已經(jīng)發(fā)布了,因此本書未能及時引入C# 8.0和C# 9.0的功能特性。值得欣慰的是,C#新版本的功能在微軟的官方文檔中有詳細(xì)描述,因此新版本的發(fā)布并不影響讀者通過本書深入了解C#的豐富特性。
.NET框架的功能非常強(qiáng)大,本書只介紹了其在互聯(lián)網(wǎng)后臺進(jìn)行開發(fā)的場景。對于其他編程場景,有興趣的讀者可以添加微信shi_yi_min(備注C#編程魔法書讀者)或發(fā)送郵件至郵箱shiyimin@vowei.com來與我一起討論。由于筆者水平有限,書中難免會出現(xiàn)一些錯誤或者表述不準(zhǔn)確的問題,懇請讀者批評指正。
致謝
從2017年12月底高婧雅編輯聯(lián)系我寫作本書開始,到2020年12月27日完稿,本書歷時3年。感謝在這么長的時間內(nèi)一直支持我的高婧雅編輯以及我的家人,特別感謝我的愛人。
謹(jǐn)以此書獻(xiàn)給我親愛的家人,以及眾多熱愛C#和.NET編程的朋友們!
資深軟件工程師和測試工程師,擁有近10年軟件行業(yè)從業(yè)經(jīng)驗,精通iOS、Android以及Windows Phone應(yīng)用程序調(diào)試、測試技術(shù)。曾經(jīng)為.NET Developer Platform部分框架代碼的提供測試服務(wù),團(tuán)隊負(fù)責(zé)的微軟開發(fā)框架產(chǎn)品有: CLR, .NET BCL, WPF, Silverlight, ASP.NET, .NET兼容性測試。
前言
第1章快速認(rèn)識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#腳本語言8
1.2 C#語言特性9
1.3 C#與.NET框架10
1.4 多操作系統(tǒng)支持12
1.4.1 在Ubuntu 14.04上安裝和使用.NET Core13
1.4.2 跨平臺運行.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 $符號:字符串內(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 訪問文件40
2.3.1 文件和文件夾基本操作40
2.3.2 流處理42
2.3.3 管道45
2.3.4 內(nèi)存映射文件48
2.4 編碼國際化54
2.5 時間和日期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 使用第三方日志庫記錄日志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章反射與動態(tài)編程 /120
4.1 反射120
4.1.1 獲取類型信息121
4.1.2 動態(tài)加載125
4.1.3 序列化128
4.1.4 使用特性132
4.1.5 版本控制140
4.2 代碼生成和動態(tài)執(zhí)行146
4.2.1 CodeDOM生成源碼147
4.2.2 Reflection.Emit152
4.2.3 IL語言157
4.2.4 多模塊組裝件161
4.3 dynamic關(guān)鍵字163
4.4 動態(tài)語言運行時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ù)庫208
5.4.2 使用EF遷移數(shù)據(jù)庫212
5.4.3 EF對關(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 信號242
6.2.4 屏障246
6.3 主動取消等待249
6.3.1 在線程中主動響應(yīng)取消請求250
6.3.2 統(tǒng)一的取消任務(wù)等待操作251
6.4 其他多線程元素254
6.4.1 Lazy254
6.4.2 線程本地存儲256
6.4.3 定時器259
6.5 無鎖編程260
6.5.1 內(nèi)存屏障和volatile關(guān)鍵字260
6.5.2 使用無鎖編程261
6.6 本章小結(jié)263
第7章并行編程 /264
7.1 并行編程基礎(chǔ)264
7.1.1 使用Task類型實現(xiàn)并行264
7.1.2 使用Parallel.For實現(xiàn)并行268
7.2 硬件特性270
7.2.1 內(nèi)存訪問順序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ò)異步編程的適用場景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ī)實現(xiàn)async方法288
7.5.3 async方法實現(xiàn)機(jī)制292
7.5.4 擴(kuò)展async方法296
7.5.5 async方法執(zhí)行上下文296
7.6 函數(shù)式編程298
7.6.1 函數(shù)式編程簡介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 錯誤處理304
7.6.7 模式匹配305
7.7 本章小結(jié)308
第8章分布式編程 /309
8.1 C#對分布式編程的支持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 消息隊列324
8.2.2 ZeroMQ325
8.2.3 系統(tǒng)架構(gòu)334
8.2.4 交易