索引
從2013年年底到2014年9月,歷時將近10個月,這本書終於看到了“出版發行”的曙光。書中內容是筆者對自己這些年工作經驗的一些總結與整理,書中每段話、每個觀點闡述均是經過筆者思考再三才被寫進去的,筆者希望能將自己的這些經驗傳授給技術后輩,希望他們未來在技術的探索道路上,能夠少走彎路。有關本書的詳細信息請參見本文后面的【新書目錄】、【試讀章節】以及【原稿試讀】。
就我個人而言,其實更傾向於閱讀電子書(除了少數經典名著外)。我電腦和手機中存儲了不少技術、人文科技之類的電子書籍,我覺得電子書閱讀起來更方便、更易攜帶。但我從小有一個“作家夢”,夢想有一天別人也會閱讀我寫的“書”,這里的書當然是指紙質書,因為在我小時候根本沒有電子書這一說:),正因為這樣,我還是選擇了將這本書出版成“紙質書”。出版過程涉及到書號費用、印刷費用以及運作費用,這些全部包含在了圖書定價中。這樣一來,我更加有壓力了,書稿我反復審查,希望不要有一丁點的觀點闡述錯誤,因為這樣會讓讀者覺得花幾十塊錢購買這本書不值,間接讓我內心不安,覺得愧疚,畢竟,傳播技術知識才是我出版本書的真正緣由。
我確保我已經審查書稿很多遍,但這只能保證書中所述觀點與我的一致,並不能保證書中觀點就真的是正確的。閱讀過程中,若有疑問,請參見本文后面的【反饋方式】給予寶貴的建議!
1)設計封面
2)實物照片
3)部分截圖
目 錄
第1章 另辟蹊徑:解讀.NET 1
1.1 前.NET時代 2
1.2 .NET的組成 3
1.2.1 .NET中的語言 4
1.2.2 .NET中的框架庫 5
1.2.3 公共類型系統 5
1.2.4 公共語言規范 5
1.2.5 公共語言運行時 6
1.2.6 .NET程序的運行流程 7
1.3 .NET中的程序集 8
1.3.1 程序集與EXE文件的區別 8
1.3.2 程序集的組成 9
1.3.3 程序集的特點 10
1.4 .NET的跨平台 10
1.4.1 Write Once, Run Anywhere的真實現狀 10
1.4.2 .NET與Java平台出現的目的 11
1.4.3 重新看待.NET 12
1.5 .NET平台出現的意義 12
1.6 本章回顧 14
1.7 本章思考 14
第2章 高屋建瓴:梳理編程約定 15
2.1 代碼中的Client與Server 16
2.2 方法與線程的關系 17
2.3 調用線程與當前線程 19
2.4 阻塞方法與非阻塞方法 20
2.5 UI線程與線程 21
2.6 原子操作 22
2.7 線程安全 22
2.8 調用與回調 26
2.9 托管資源與非托管資源 27
2.10 框架與庫 28
2.11 面向(或基於)對象與面向(或基於)組件 29
2.12 接口 30
2.13 協議 32
2.14 本章回顧 36
2.15 本章思考 36
第3章 編程之基礎:數據類型 37
3.1 引用類型與值類型 38
3.1.1 內存分配 39
3.1.2 字節序 41
3.1.3 裝箱與拆箱 42
3.2 對象相等判斷 43
3.2.1 引用類型判等 43
3.2.2 簡單值類型判等 44
3.2.3 復合值類型判等 45
3.3 賦值與復制 48
3.3.1 引用類型賦值 48
3.3.2 值類型賦值 49
3.3.3 傳參 50
3.3.4 淺復制 53
3.3.5 深復制 55
3.4 對象的不可改變性 59
3.4.1 不可改變性定義 59
3.4.2 定義不可改變類型 60
3.5 本章回顧 62
3.6 本章思考 62
第4章 物以類聚:對象也有生命 65
4.1 堆和棧 66
4.2 堆中對象的出生與死亡 69
4.2.1 引用和實例 69
4.2.2 析構方法 71
4.2.3 正確使用對象 73
4.3 管理非托管資源 75
4.3.1 釋放非托管資源的最佳時間 75
4.3.2 繼承與組合中的非托管資源 77
4.4 正確使用IDisposable接口 82
4.4.1 Dispose模式 83
4.4.2 對象的Dispose()和Close() 87
4.5 本章回顧 88
4.6 本章思考 88
第5章 重中之重:委托與事件 91
5.1 什么是.NET中的委托 92
5.1.1 委托的結構 92
5.1.2 委托鏈表 95
5.1.3 委托的“不可改變”特性 101
5.1.4 委托的作用 103
5.2 事件與委托的關系 105
5.3 使用事件編程 107
5.3.1 注銷跟注冊事件同樣重要 107
5.3.2 多線程中使用事件 107
5.3.3 委托鏈表的分步調用 109
5.3.4 正確定義一個使用了事件的類 111
5.4 弱委托 116
5.4.1 強引用與弱引用 116
5.4.2 弱委托的定義 119
5.4.3 弱委托的使用場合 121
5.5 本章回顧 121
5.6 本章思考 122
第6章 線程的升級:異步編程模型 123
6.1 異步編程的必要性 124
6.1.1 同步調用與異步調用 124
6.1.2 異步調用的優點 125
6.2 委托的異步調用 126
6.2.1 BeginInvoke與EndInvoke 126
6.2.2 AsyncCallback 128
6.2.3 處理異步調用時的異常 131
6.2.4 異步調用的應用 132
6.3 非委托的異步調用 134
6.3.1 異步方法 134
6.3.2 FileStream.BeginRead/FileStream.BeginWrite 136
6.4 異步編程時的注意事項 137
6.5 本章回顧 138
6.6 本章思考 138
第7章 可復用代碼:組件的來龍去脈 141
7.1 .NET中的組件 142
7.1.1 組件的定義 142
7.1.2 Windows Forms中的組件 142
7.1.3 Windows Forms中的控件 143
7.2 容器-組件-服務模型 144
7.2.1 容器的另類定義 144
7.2.2 容器與組件的合作 145
7.2.3 窗體設計器 150
7.3 設計時與運行時 154
7.3.1 組件的設計時與運行時 154
7.3.2 區分組件的當前狀態 155
7.3.3 組件狀態的應用 157
7.4 控件 157
7.4.1 控件基類 157
7.4.2 用戶自定義控件 158
7.5 本章回顧 160
7.6 本章思考 160
第8章 經典重視:桌面GUI框架揭秘 163
8.1 了解傳統Win32應用程序的必要性 164
8.2 Win32應用程序的結構 165
8.2.1 運行平台決定程序結構 165
8.2.2 Windows消息循環 167
8.2.3 窗口過程 169
8.2.4 創建基於Win32的單窗體應用程序 171
8.2.5 創建基於Win32的多窗體應用程序 178
8.3 .NET Winform程序與傳統Win32程序的關聯 184
8.4 Windows Forms框架 184
8.5 Winform程序的結構 187
8.5.1 UI線程 188
8.5.2 消息循環 189
8.5.3 創建窗體 195
8.5.4 窗口過程 197
8.6 模式窗體與非模式窗體 200
8.7 本章回顧 205
8.8 本章思考 205
第9章 溝通無礙:網絡編程 207
9.1 兩種Socket通信方式 208
9.1.1 IP與端口 208
9.1.2 基於連接的TCP通信 209
9.1.3 基於無連接的UDP通信 211
9.1.4 應用層協議 212
9.1.5 .NET中Socket編程的相關類型 215
9.2 TCP通信的實現 217
9.2.1 定義TCP通信應用層協議 218
9.2.2 編寫TCP通信服務端 219
9.2.3 編寫TCP通信客戶端 225
9.3 UDP通信的實現 227
9.3.1 定義UDP通信應用層協議 228
9.3.2 編寫UDP通信客戶端 229
9.4 異步編程在網絡編程中的應用 235
9.4.1 異步發送數據 237
9.4.2 異步實現“泵”結構 238
9.5 本章回顧 241
9.6 本章思考 241
第10章 動力之源:代碼中的“泵” 243
10.1 “泵”的概念 244
10.1.1 現實生活中的“泵” 244
10.1.2 代碼中的“泵” 245
10.1.3 代碼中“泵”的作用 247
10.2 常見的“泵”結構 249
10.2.1 桌面GUI框架中的“泵” 249
10.2.2 Socket通信中的“泵” 250
10.2.3 Web服務器中的“泵” 251
10.3 “泵”對框架的意義 258
10.3.1 重新回到框架定義 258
10.3.2 框架離不開“泵” 258
10.4 本章回顧 259
10.5 本章思考 259
第11章 規繩矩墨:模式與原則 261
11.1 軟件的設計模式 262
11.1.1 觀察者模式 262
11.1.2 Windows Forms中的觀察者模式 265
11.1.3 設計模式分類 267
11.2 軟件的設計原則 267
11.2.1 SOLID原則概述 267
11.2.2 單一職責原則 268
11.2.3 開閉原則 270
11.2.4 里氏替換原則 272
11.2.5 接口隔離原則 275
11.2.6 依賴倒置原則 276
11.3 設計模式與設計原則對框架的意義 278
11.4 本章回顧 279
11.5 本章思考 279
第12章 難免的尷尬:代碼依賴 281
12.1 從面向對象開始 282
12.1.1 對象基礎:封裝 282
12.1.2 對象擴展:繼承 286
12.1.3 對象行為:多態 289
12.2 不可避免的代碼依賴 292
12.2.1 依賴存在的原因 292
12.2.2 耦合與內聚 294
12.2.3 依賴造成的“尷尬” 295
12.3 降低代碼依賴 297
12.3.1 認識“抽象”與“具體” 297
12.3.2 再看“依賴倒置原則” 299
12.3.3 依賴注入 302
12.4 框架的“代碼依賴” 305
12.4.1 控制轉換 305
12.4.2 依賴注入對框架的意義 306
12.5 本章回顧 306
12.6 本章思考 306
初稿。由於內容過多,我第一次嘗試使用word發布博客,本以為一切順利,結果發布后的格式很多都亂了,尤其是圖片和代碼,后來不得不一點點的手動修改。調整格式用了很長時間。初稿中有些表述可能不太好,出版社編輯進行了一些修改。
如果覺得值得一讀,可以購買一本,多謝支持!
2.亞馬遜
3.京東
作者:周見智,博圖軒
出版社:清華大學出版社
圖書書號/ISBN:9787302393306
出版日期:2015年5月
開本:16開
圖書頁數:320
圖書裝訂:平裝
圖書規格:185mm×240mm
版次:1-1
印張:20
字數:446千字
閱讀本書時如有任何問題、建議以及疑惑均可以通過以下方式與筆者聯系,筆者會認真閱讀並虛心回復:
(1)QQ:568826820;QQ群:440170769
(2)郵箱:zhouzhi@syxysoft.com;
(3)在本篇博客下面直接留言。
(1)感謝博客園、CSDN等技術社區平台,感謝廣大網友的熱心支持;
(2)感謝博圖軒圖書工作室、清華大學出版社(各位編輯們)、網上認識的幾位大牛(老師),如@張善友、@程序員鄒欣、@教書匠金旭亮、@出版人周筠老師等等;
(3)感謝@青檸檬、一些同學以及一些同事的持續支持與鼓勵。
在這里會陸續更新各種問題。
1.第一章中有關.NET跨平台的內容是在2014年11月份之前寫的,后來沒來得及修改,所以並沒有提到.NET新版本官方支持的跨平台、開源等特性;
2.P39頁“注”部分“Int32 a = new Int32(0);”由於疏忽,應改為“Int32 a = new Int32();”;
QQ交流群:440170769