作 者:(英)喬恩·斯基特 著 韓博 譯
定 價:129
出 版 社:人民郵電出版社
出版日期:2020年10月01日
頁 數:440
裝 幀:平裝
ISBN:9787115547255
C#領域的經典著作,新版重磅升級!1.知名技術專家的經典之作,在C#和.NET領域享有盛譽。2.與其他泛泛介紹C#的圖書不同,本書深度探究C#的特性,並結合技術發展,引領讀者深入C#的時空。3.作者從語言設計的動機出發,介紹支持這些特性的核心概念;基於C#語言的發展背景介紹新的語言特性,並用極富實際意義的示例,向讀者展示編寫代碼和設計解決方案的理想方式。4.新版重新組織了內容,進行了重寫與濃縮,還全面更新並細致剖析了C#6和C#7的新增特性。5.提供源代碼。作者將多年的C#開發經等
●第一部分C#背景介紹
第1章大浪淘沙2
1.1一門與時俱進的語言2
1.1.1類型繫統——全能型助手3
1.1.2代碼更簡潔4
1.1.3使用LINQ簡化數據訪問8
1.1.4異步8
1.1.5編碼效率與執行效率之間的取舍9
1.1.6快速迭代:使用小版本號10
1.2一個與時俱進的平臺11
1.3一個與時俱進的社區12
1.4一本與時俱進的好書13
1.4.1內容詳略得當13
1.4.2使用Noda Time作為示例14
1.4.3術語選擇14
1.5小結15
第二部分從C#2到C#5
第2章C#218
2.1泛型18
2.1.1示例:泛型誕生前的集合19
2.1.2泛型降臨21
2.1.3泛型的適用範圍25
2.1.4方法類型實參的類型推斷26
2.1.5類型約束28
2.1.6default運算符和typeof運算符30
2.1.7泛型類型初始化與狀態32
2.2可空值類型34
2.2.1目標:表達信息的缺失34
2.2.2CLR和framework的支持:Nullable結構體35
2.2.3語言層面支持38
2.3簡化委托的創建43
2.3.1方法組轉換43
2.3.2匿名方法44
2.3.3委托的兼容性45
2.4迭代器46
2.4.1迭代器簡介47
2.4.2延遲執行48
2.4.3執行yield語句49
2.4.4延遲執行的重要性50
2.4.5處理finally塊51
2.4.6處理finally的重要性53
2.4.7迭代器實現機制概覽54
2.5一些小的特性58
2.5.1局部類型59
2.5.2靜態類60
2.5.3屬性的getter/setter訪問分離61
2.5.4命名空間別名61
2.5.5編譯指令63
2.5.6固定大小的緩衝區64
2.5.7InternalsVisibleTo65
2.6小結65
第3章C#3:LINQ及相關特性66
3.1自動實現的屬性66
3.2隱式類型67
3.2.1類型術語67
3.2.2隱式類型的局部變量68
3.2.3隱式類型的數組69
3.3對像和集合的初始化71
3.3.1對像初始化器和集合初始化器簡介71
3.3.2對像初始化器72
3.3.3集合初始化器74
3.3.4僅用單一表達式就能完成初始化的好處75
3.4匿名類型76
3.4.1基本語法和行為76
3.4.2編譯器生成類型78
3.4.3匿名類型的局限性79
3.5lambda表達式80
3.5.1lambda表達式語法簡介81
3.5.2捕獲變量82
3.5.3表達式樹89
3.6擴展方法91
3.6.1聲明擴展方法91
3.6.2調用擴展方法92
3.6.3擴展方法的鏈式調用93
3.7查詢表達式94
3.7.1從C#到C#的查詢表達式轉換95
3.7.2範圍變量和隱形標識符95
3.7.3選擇使用哪種LINQ語法96
3.8終極形態:LINQ97
3.9小結98
第4章C#4:互操作性提升99
4.1動態類型99
4.1.1動態類型介紹100
4.1.2超越反射的動態行為104
4.1.3動態行為機制速覽108
4.1.4動態類型的局限與意外111
4.1.5動態類型的使用建議115
4.2可選形參和命名實參116
4.2.1帶默認值的形參和帶名字的實參117
4.2.2如何決定方法調用的含義118
4.2.3對版本號的影響119
4.3COM互操作性提升121
4.3.1鏈接主互操作程序集121
4.3.2COM組件中的可選形參123
4.3.3命名索引器124
4.4泛型型變125
4.4.1泛型型變示例125
4.4.2接口和委托聲明中的變體語法126
4.4.3變體的使用127
4.4.4泛型型變實例129
4.5小結130
第5章編寫異步代碼131
5.1異步函數簡介132
5.1.1異步問題初體驗133
5.1.2拆分第一個例子134
5.2對異步模式的思考135
5.2.1關於異步執行本質的思考136
5.2.2同步上下文137
5.2.3異步方法模型138
5.3async方法聲明139
5.3.1async方法的返回類型140
5.3.2async方法的參數141
5.4await表達式141
5.4.1可等待模式142
5.4.2await表達式的條件144
5.5返回值的封裝145
5.6異步方法執行流程146
5.6.1await的操作對像與時機146
5.6.2await表達式的運算147
5.6.3可等待模式成員的使用150
5.6.4異常拆封151
5.6.5完成方法152
5.7異步匿名函數156
5.8C#7自定義task類型157
5.8.199.9%的情況:ValueTask158
5.8.2剩下0.1%的情況:創建自定義task類型160
5.9C#7.1中的異步Main方法161
5.10使用建議162
5.10.1使用ConfigureAwait避免上下文捕獲(擇機使用)163
5.10.2啟動多個獨立task以實現並行164
5.10.3避免同步代碼和異步代碼混用165
5.10.4根據需要提供取消機制165
5.10.5測試異步模式165
5.11小結166
第6章異步原理167
6.1生成代碼的結構168
6.1.1樁方法:準備和開始第一步171
6.1.2狀態機的結構172
6.1.3MoveNext()方法(整體介紹)175
6.1.4SetStateMachine方法以及狀態機的裝箱事宜177
6.2一個簡單的MoveNext()實現177
6.2.1一個完整的具體示例178
6.2.2MoveNext()方法的通用結構179
6.2.3詳探await表達式181
6.3控制流如何影響MoveNext()183
6.3.1await表達式之間的控制流很簡單183
6.3.2在循環中使用await184
6.3.3在try/finally塊中使用await表達式185
6.4執行上下文和執行流程188
6.5再探自定義task類型189
6.6小結190
第7章C#5附加特性191
7.1在foreach循環中捕獲變量191
7.2調用方信息attribute193
7.2.1基本行為193
7.2.2日志194
7.2.3簡化INotifyProperty-Changed的實現195
7.2.4調用方信息attribute的小眾使用場景196
7.2.5舊版本.NET使用調用方信息attribute201
7.3小結202
第三部分C#6
第8章極簡屬性和表達式主體成員204
8.1屬性簡史204
8.2自動實現屬性的升級206
8.2.1隻讀的自動實現屬性206
8.2.2自動實現屬性的初始化207
8.2.3結構體中的自動實現屬性208
8.3表達式主體成員210
8.3.1簡化隻讀屬性的計算210
8.3.2表達式主體方法、索引器和運算符213
8.3.3C#6中表達式主體成員的214
8.3.4表達式主體成員使用指南216
8.4小結218
第9章字符串特性219
9.1NET中的字符串格式化回顧219
9.1.1簡單字符串格式化219
9.1.2使用格式化字符串來實現自定義格式化220
9.1.3屬地化221
9.2內插字符串字面量介紹224
9.2.1簡單內插224
9.2.2使用內插字符串字面量格式化字符串225
9.2.3內插原義字符串字面量225
9.2.4編譯器對內插字符串字面量的處理(第1部分)226
9.3使用FormattableSting實現屬地化227
9.3.1編譯器對內插字符串字面量的處理(第2部分)228
9.3.2在特定culture下格式化一個FormattableString229
9.3.3FormattableString的其他用途230
9.3.4在舊版本.NET中使用FormattableString233
9.4使用指南和使用234
9.4.1適合開發人員和機器,但可能不適合最終用戶235
9.4.2關於內插字符串字面量的硬性236
9.4.3何時可以用但不應該用238
9.5使用nameof訪問標識符239
9.5.1nameof的第一個例子239
9.5.2nameof的一般用法241
9.5.3使用nameof的技巧與陷阱243
9.6小結246
第10章簡潔代碼的特性“盛宴”247
10.1using static指令247
10.1.1引入靜態成員247
10.1.2using static與擴展方法250
10.2對像初始化器和集合初始化器特性增強252
10.2.1對像初始化器中的索引器252
10.2.2在集合初始化器中使用擴展方法256
10.2.3測試代碼與產品代碼259
10.3空值條件運算符260
10.3.1簡單、安全地解引用260
10.3.2關於空值條件運算符的更多細節261
10.3.3處理布爾值比較262
10.3.4索引器與空值條件運算符263
10.3.5使用空值條件運算符提升編程效率263
10.3.6空值條件運算符的局限性265
10.4異常過濾器265
10.4.1異常過濾器的語法和語義266
10.4.2重試操作270
10.4.3記錄日志的“副作用”272
10.4.4單個、有針對性的日志過濾器273
10.4.5為何不直接拋出異常273
10.5小結274
第四部分C#7及其後續版本
第11組進行組合277
1組介紹277
1組字組類型278
11.2.1語法278
11.組字面素名稱(C#7.1)280
11.組用作變量的容器281
1組類型及其轉換285
11.組字面量的類型285
11.3組字組類型的轉換287
11.組類型之間的轉換290
11.3.4類型轉換的應用292
11.3.5繼素名稱檢查292
11.3.6等價運算符與不等價運算符(C#7.3)293
11.4CLR組294
11.4.1引入System.ValueTuple<...>294
11.4.素名稱294
11.組類型轉換的實現296
11.組的字符串表示296
11.4.5一般等價比較和排序比較297
11.4.6結構化等價比較和排序比較298
11.4.組組299
11.4.8非泛型ValueTuple結構體300
11.4.9擴展方法301
1組的替代品301
11.5.1System.Tuple<...>301
11.5.2匿名類型301
11.5.3命名類型302
1組的使用建議302
11.6.1非公共API以及易變的代碼303
11.6.2局部變量303
11.6.3字段304
11.組和動態類型不太搭調305
11.7小結306
第12章分解與模式匹配307
12.組307
12.1.1分解 變量308
12.1.2通過分解操作為已有變量或者屬性賦值310
12.組字面量分解的細節313
12組類型的分解操作314
12.2.1實例分解方法314
12.2.2擴展分解方法與重載315
12.2.3編譯器對於Deconstruct調用的處理316
12.3模式匹配簡介317
12.4C#7.0可用的模式319
12.4.1常量模式319
12.4.2類型模式320
12.4.3var模式323
12.5模式匹配與is運算符的搭配使用324
12.6在switch語句中使用模式325
12.6.1哨兵語句326
12.6.2case標簽中的模式變量的作用域328
12.6.3基於模式的switch語句的運算順序329
12.7對模式特性使用的思考330
12.7.1發現分解的時機330
12.7.2發現模式匹配的使用時機331
12.8小結331
第13章引用傳遞提升執行效率332
13.1回顧:ref知多少333
13.2ref局部變量和ref return336
13.2.1ref局部變量336
13.2.2ref return341
13.2.3條件運算符?:和ref值(C#7.2)343
13.2.4ref readonly(C#7.2)343
13.3in參數(C#7.2)345
13.3.1兼容性考量346
13.3.2in參數驚人的不可變性:外部修改347
13.3.3使用in參數進行方法重載348
13.3.4in參數的使用指導348
13.4將結構體聲明為隻讀(C#7.2)350
13.4.1背景:隻讀變量的隱式復制350
13.4.2結構體的隻讀修飾符352
13.4.3XML序列化是隱式讀寫屬性353
13.5使用ref參數或者in參數的擴展方法(C#7.2)354
13.5.1在擴展方法中使用ref/in參數來規避復制354
13.5.2ref和in擴展方法的使用355
13.6類ref結構體(C#7.2)357
13.6.1類ref結構體的規則357
13.6.2Span和棧內存分配358
13.6.3類ref結構體的IL表示362
13.7小結362
第14章C#7的代碼簡潔之道363
14.1局部方法363
14.1.1局部方法中的變量訪問364
14.1.2局部方法的實現367
14.1.3使用指南371
14.2out變量373
14.2.1out參數的內聯變量聲明374
14.2.2C#7.3 關於out變量和模式變量解除的374
14.3數字字面量的改進375
14.3.1二進制整型字面量375
14.3.2下劃線分隔符376
14.4throw表達式377
14.5default字面量(C#7.1)377
14.6非尾部命名實參379
14.7私有受保護的訪問權限(C#7.2)380
14.8C#7.3的一些小改進380
14.8.1泛型類型約束381
14.8.2重載決議改進381
14.8.3字段的attribute支持自動實現的屬性382
14.9小結383
第15章C#8及其後續384
15.1可空引用類型384
15.1.1可空引用類型可以解決什麼問題385
15.1.2在使用引用類型時改變其含義385
15.1.3輸入可空引用類型387
15.1.4編譯時和執行期的可空引用類型387
15.1.5damnit運算符或者bang運算符389
15.1.6可空引用類型遷移的經驗391
15.1.7未來的改進393
15.2switch表達式396
15.3嵌套模式匹配398
15.3.1使用模式來匹配屬性398
15.3.2分解模式399
15.3.3忽略模式中的類型399
15.4index和range400
15.4.1index與range類型和字面量401
15.4.2應用index和range402
15.5更多異步集成403
15.5.1使用await實現異步資源回收403
15.5.2使用foreach await的異步迭代404
15.5.3異步迭代器407
15.6預覽版中尚未提供的特性408
15.6.1默認接口方法408
15.6.2記錄類型409
15.6.3更多特性410
15.7歡迎加入412
15.8小結412
附錄特性與語言版本對照表413
C#語言簡潔優雅,精妙強大,是當今編程語言的集大成者,功能不斷推陳出新,受到眾多開發人員的推崇。本書是C#領域的經典著作,新版重磅升級,不僅重新組織了內容,還全面更新並細致剖析了C#6和C#7的新增特性,為讀者奉上知識盛宴。作者在詳盡展示C#各個知識點的同時,注重從現像中挖掘本質,解讀語言背後的設計思想,深入探究了C#的核心概念和經典特性,並將這些特性融入代碼示例,幫助讀者順暢使用C#,享受使用C#編程的樂趣。本書適合C#開發人員閱讀。