你將從本書學到什麼?
《深入淺出 C#》是一段物件導向編程、C#、Visual Studio IDE 的完整學習經驗。本書專為你的大腦量身打造,內容涵蓋 C# 3.0 與 Visual Studio 2008,並且教導你許多事情,從垃圾收集機制(Garbage Collection)、擴展方法(Extension Method)、到雙緩衝動畫(double buffered animation)都有。另外,你也將精通 C# 最熱門與最新的 LINQ 語法,可於 .NET 群集、SQL 資料庫、等資料來源中查詢你的資料。完成本書的閱讀之時,你將是一個熟練的 C# 程式設計師,並且有能力設計與撰寫大型應用程式。
這本書為何如此與眾不同?
我們認為你的時間寶貴,不該浪費在與新概念周旋不下。運用認知科學與學習理論的最新研究成果,《深入淺出 C#》採取專為大腦運作而設計的豐富視覺化風格,而不是令你昏昏欲睡的冗贅文字敘述。
各界推薦
名人推薦:
『我未曾從頭到尾讀完一本電腦書,但這一本確實從第一頁到最後一頁都緊緊抓住我的注意力。假如你想要以趣味橫生的方式深入學習 C#,這本書正是為你量身訂製的。』
— Andy Parker,C# 程式設計新手
『假如你對其他古板的 C# 書籍望而卻步,你會深深愛上這本書。』
— Jay Hilyard,軟體開發者,《C# 3.0 Cookbook》的共同作者
『《深入淺出 C#》是一個充滿樂趣的教學課程,全書充滿令人難忘的範例與趣味橫生的練習,生動活潑的風格更是引人入勝!』
— Joseph Albahari,C# 設計架構師,Egton Medical Information Systems,《C# 3.0 in a Nutshell》的共同作者
名人推薦:『我未曾從頭到尾讀完一本電腦書,但這一本確實從第一頁到最後一頁都緊緊抓住我的注意力。假如你想要以趣味橫生的方式深入學習 C#,這本書正是為你量身訂製的。』
— Andy Parker,C# 程式設計新手
『假如你對其他古板的 C# 書籍望而卻步,你會深深愛上這本書。』
— Jay Hilyard,軟體開發者,《C# 3.0 Cookbook》的共同作者
『《深入淺出 C#》是一個充滿樂趣的教學課程,全書充滿令人難忘的範例與趣味橫生的練習,生動活潑的風格更是引人入勝!』
— Joseph Albahari,C# 設計架構師,Egton Medical Information Systems...
目錄
序
1 使用 C#增進生產力:視覺化應用程式,短短 10 分鐘之內完成
為什麼要學 C#
C# 與 Visual Studio IDE 讓你的工作更輕鬆
幫助 CEO 達成無紙化的目標
建造程式之前,先瞭解使用者的需求
你即將建造的東西
在 Visual Studio 裡做什麼...
Visual Studio 幫你做什麼...
開發使用者介面
Visual Studio,藏鏡人
增修自動生成的程式碼
已經能夠執行你的應用程式
我們需要資料庫來儲存資訊
為聯絡簿建立資料表
聯絡卡上的欄位是 People 資料表裡的資料欄
完成資料表的建立
解析資料表讓應用程式可以存取它
將聯絡卡資料插入資料庫
使用 data source 將表單連結到資料庫物件
為表單增加資料庫驅動的控制項
良好的應用程式是直覺易用的
如何將你的應用程式轉變成每個人的應用程式
將應用程式交給使用者
事情還沒完:測試你的安裝
你建造了完整的資料驅動應用程式
2 程式碼探究:刨根究底
當你這樣做時...
...IDE 便這樣做
程式的來由
IDE 幫助你編程
當你在 IDE 中做改變時,程式碼也跟著改變
程式剖析
你的程式知道從哪裡開始
你可以改變程式的進入點
兩個類別可以存在於相同名稱空間
程式利用變數操作資料
C# 使用眾所周知的數學符號
迴圈執行一次又一次發生的動作
撰碼時間
利用 if / else 陳述式做決策
設定條件並看看是否為真
3 物件導向:讓程式碼合理化
Mike 如何思考他的問題
Mike 的汽車導航系統如何思考他的問題
Mike 的 Navigator 類別具有設定及修改路徑規劃的方法
運用所學建造簡單的應用程式
Mike 有主意了
Mike 能夠利用物件解決他的問題
使用類別建立物件
從類別建立新物件時,稱之為該類別的實例
物件引導你找到更好的解法
實例使用欄位來記錄資料
來建立一些實例吧!
感謝記憶體
程式的要點
運用類別與方法名稱讓程式更符合直覺
賦予你的類別自然的結構
類別圖幫你組織類別,讓它們更趨合理
建立類別處理兩個傢伙的金錢往來
為那兩個傢伙建立專案
建立表單與那兩個傢伙互動
還有更簡單的方法初始化物件
設計符合直覺之類別的幾個想法
4 型別與參考:知道你的資料在哪裡嗎?
變數型別決定它可以儲存什麼類型的資料
變數就像資料的外帶杯
十公升的資料放在五公升大的袋子中
甚至在數字的尺寸正確時
當你強制轉換過大的值時,C# 會自動調整它
C# 自動做一些強制轉換
呼叫方法時,變數必須符合參數的型別
結合等號的運算子
物件也是變數
使用參考變數參照你的物件
參考就像是物件的標籤
如果不再具有任何參考,物件會被垃圾收集機制處理掉
多重參考及其副作用
兩個參考表示有兩條途徑改變物件的資料
特例:陣列
陣列也能包含一堆參考變數
歡迎光臨 Sloppy Joe 三明治
件利用參考與彼此溝通
宣告之後,存在之前
C# 實驗一:賽狗場的一天
規格:建立 Racetrack 模擬程式
完成品
5 封裝:保護隱私
Kathleen 是活動規劃者
估價程式要做什麼?
Kathleen 的測試驅動
每個選項應該個別被計算
很容易意外地誤用你的物件
封裝表示讓某些資料為類別所私有
運用封裝控制類別的方法與欄位的存取
然而,realName欄位真的有受到保護嗎?
私有欄位與方法僅能從類別內部進行存取
關於封裝類別的幾個想法
封裝讓你的資料保持純淨
特性讓封裝更簡單
建立應用程式測試 Farmer 類別
使用自動特性完成此類別
萬一我們想要改變飼料乘數?
使用建構子初始化私有欄位
6 繼承:物件族譜
Kathleen 也規劃生日派對
我們需要 BirthdayParty 類別
還有一件事...能夠針對 12 人以上的派對加收 100 元嗎?
當類別使用繼承時,你只需撰碼一次
建立你的類別模型:從一般化開始,逐步特殊化
如何設計動物園模擬程式
使用繼承避免子類別之間的重複程式碼
不同的動物發出不同聲音
想一想如何為動物分組
建立類別階層結構
每個子類別擴充它的基礎類別
使用冒號繼承基礎類別
繼承會將基礎類別的欄位、特性、與方法增加到子類別
子類別能夠覆寫方法,改變或取代它所繼承的方法
任何可使用基礎類別的地方,都可用它的子類別代替
子類別能夠使用 base 關鍵字存取它的基礎類別
當基礎類別具有建構子時,子類別也需要一個
現在,準備完成 Kathleen 的工作
建立蜂巢管理系統
首先,建立基本的系統
使用繼承擴充蜂巢管理系統
7 介面與抽象類別:讓類別信守承諾
回到蜂巢的問題
利用繼承為不同種類的蜜蜂建立類別
介面告訴類別要實作特定的方法與特性
使用 interface 關鍵字來定義介面
現在,你可以建立做兩項工作的 NectarStinger 實例
實作介面的類別必需包含該介面的所有方法
練習一下介面的使用
你不能夠實例化一個介面,但可以參照它
介面參考的運作方式就像物件參考
你可以使用 "is" 判斷類別是否實作某個介面
介面能夠繼承其他介面
RoboBee 4000 能做工蜂的工作,而不需消耗寶貴的蜂蜜
"is" 告訴你物件實作什麼;"as" 告訴編譯器如何看待你的物件
CoffeeMaker 也是一種 Appliance
向上轉型對物件與介面皆有效
向下轉型讓你將 Appliance 轉換回 CoffeeMaker
向上轉型與向下轉型也適用於介面 公用與私有之外
存取修飾子改變作用域
某些類別絕不應該被實例化
抽象類別就像介面與類別的混合體
如先前所述,某些類別不應該被實例化
抽象方法沒有方法主體
多型表示一個物件可以採用多種不同形式
8 列舉與群集:儲存大量資料
資料的儲存分類並非總是根據字串
enum 讓你列舉一組有效值
enum 讓你用名稱代表數字
我們可以使用陣列建立一副牌
陣列不易使用
串列讓儲存一組東西變容易
串列比陣列有彈性
串列可動態增長或縮減
串列可儲存任何型別
群集初始化器的運作就像物件初始化器
建立一個由鴨子所組成的串列
串列雖簡單,但排序不好處理
兩種方式排序你的鴨子
使用 IComparer 告訴你的串列如何排序
建立比較器物件
IComparer 能夠進行複雜的比較
使用 Dictionary 來儲存鍵與值
Dictionary 功能概述
鍵與值可以是不同型別
你可以建立自己的多載方法
還有更多的群集型別
佇列是 FIFO — 先進先出
堆疊是 LIFO — 後進先出
C# 實驗二:絕命大追擊
規格:建造冒險遊戲
歡樂時光才要開始!
9 檔案讀寫:儲存位元組陣列,保存工作成果
C# 利用串流讀寫資料
不同的串流讀寫不同的東西
FileStream 將位元組寫到檔案
讀與寫分別使用兩個物件
資料能夠通過一個以上的串流
使用內建物件彈出標準對話框
對話框也是物件
使用檔案對話框開啟與儲存檔案
IDisposable 確保你的物件被適切地釋放掉
使用 using 陳述式避免檔案系統錯誤
寫入檔案通常涉及諸多決策
使用 switch 陳述式選擇合適的選項
增加多載的 Deck() 建構子,從檔案讀取一疊牌
當物件被序列化時,究竟發生什麼事?
然而,物件的狀態究竟是什麼?什麼需要被保存?
當物件被序列化時,它所參照的所有物件也會被序列化...
序列化讓你一次讀寫整個物件
假如想要讓你的類別可序列化,將它標上 [Serializable] 屬性
.NET 自動將文字轉成 Unicode
C# 使用位元組陣列移動資料
使用 BinaryWriter 寫入二進制資料
你也可以手動讀寫序列化檔案
StreamReader 與 StreamWriter 能夠運作得不錯
10 例外處理:救火生涯催人老
Brian 需要讓藉口管理程式行動化
當程式丟出例外時,.NET 產生 Exception 物件
Brian 的程式碼發生了非預期的狀況
所有的例外物件都繼承 Exception
偵錯器幫你追蹤及防範程式碼中的例外
使用 IDE 偵錯器查出藉口管理程式出了什麼問題
啊!程式碼還是有問題
使用 try / catch 處理例外
當你要呼叫的方法具有某種風險時,會發生什麼事?
使用偵錯器追蹤 try / catch 的執行流
如果你有無論如何都要執行的程式碼,就使用 finally 區塊
利用 Exception 物件取得問題的資訊
使用多個 catch 區塊來處理多種類型的例外
一個類別丟出例外,另一個類別捕捉例外
蜜蜂需要 OutOfHoney 例外
一種避免諸多問題的簡單方式:using 提供免費的 try 與 finally
避免例外:實作 IDisposable,做你自己的清理工作
最糟糕的 catch 區塊:註解
暫時性的解法也 OK(暫時的)
關於例外處理的幾個簡單想法
Brian 終於請好假了
11 事件與委託:程式碼在你的背後做什麼
可曾希望你的物件能夠自己思考嗎?
但物件知道該如何回應嗎?
當事件發生時...物件在偵聽
一個物件引發事件,其他物件偵聽它...
接著,處理該事件
打通任督二脈
IDE 自動為你建立事件處理器
你一直在建立的表單全都在使用事件
連接事件傳送者與事件接收者
delegate 替代實際的方法
作用中的 delegate
任何物件都可以訂閱公用的事件
使用回呼代替事件,將恰好一個物件掛鉤到 delegate
回呼使用 delegate,而不是事件
12 回顧與展望:知識、力量、及建造好軟體
寶貝,你已經走了好長的一段路
我們也變成了養蜂人
蜂巢模擬程式的架構
建造蜂巢模擬程式
花之生與死
現在,我們需要 Bee 類別
填寫 Hive 類別
Hive 的 Go() 方法
準備 World
我們正在建造回合制系統
賦予蜜蜂行為
主表單叫 World 執行 Go()
可利用 World 取得統計資料
計時器一次又一次觸發事件
計時器在背後使用 delegate
處理蜜蜂分組
群集存放...資料
LINQ 讓群集與資料庫的資料處理變容易
13 控制項與繪圖:妝乎水水
你一直在使用控制項與程式互動
表單控制項只是物件
增加展圖器到你的架構中
控制項很適合作為視覺顯示元素
建立你的第一個動畫控制項
你的控制項也必須釋放它們的控制項!
UserControl 是建造控制項的簡單方式
增加蜂巢與田野表單到專案中
建立 Renderer
更仔細看看效能議題
使用 Graphics 物件重新調整 Bitmap 的大小
你的圖像資源被儲存在 Bitmap 物件中
使用 System.Drawing 自行控制繪圖
GDI+ 繪圖的快速探索
使用 Graphics 在表單上繪圖
Graphics 能夠修正我們的透明度問題
利用 Paint 事件讓圖形乖乖待著
更仔細看看表單與控制項如何重繪它們自己
雙重緩衝讓動畫看起來更平順
雙重緩衝被建構到表單與控制項中
使用 Graphics 物件與事件處理器來進行列印工作
PrintDocument 操作列印對話框及預覽列印視窗物件
14 CAPTAIN AMAZING:物件之死
Captain Amazing,物件村中最瘋狂的物件,對他的仇敵窮追不捨
做某事的最後機會...物件的 finalizer
finalizer 究竟何時執行?
Dispose() 配合 using,finalizer 配合垃圾收集機制
finalizer 不能倚賴穩定性
讓物件在 Dispose() 中序列化它自己
同時,在物件村的大街上...
struct 看似物件...
...但沒有在 heap 中
值被複製,而參考被指定
struct 是值型別;物件是參考型別
stack vs. heap:更深入看看記憶體
Captain Amazing...不完整
擴展方法為既有類別增添新行為
擴展基礎型別:字串
15 LINQ:掌控你的資料
一個簡單的專案...
...但資料四散
LINQ 能夠從多個來源擷取資料
.NET 群集已經準備好配合 LINQ
LINQ 讓查詢變簡單
LINQ 簡單,但查詢可以很複雜
多才多藝的 LINQ
LINQ 能夠結合你的結果,並且進行分組
將 Jimmy 的值結合成分組
使用 join 將兩個群集結合到一個查詢
Jimmy 省下一大筆錢
將 LINQ 連接到 SQL 資料庫
使用 join 查詢連接 Starbuzz 與 OCP
C# 實驗三:入侵者
電玩遊戲的老祖宗
路未央...
C#遺珠:前五大遺珠
#1 LINQ 與 XML
#2 重構
#3 幾個我們最愛用的 Toolbox 元件
#4 控制台應用程式
#5 Windows Presentation Framework
你知道 C# 與 .NET Framework 能夠...
索引
序
1 使用 C#增進生產力:視覺化應用程式,短短 10 分鐘之內完成
為什麼要學 C#
C# 與 Visual Studio IDE 讓你的工作更輕鬆
幫助 CEO 達成無紙化的目標
建造程式之前,先瞭解使用者的需求
你即將建造的東西
在 Visual Studio 裡做什麼...
Visual Studio 幫你做什麼...
開發使用者介面
Visual Studio,藏鏡人
增修自動生成的程式碼
已經能夠執行你的應用程式
我們需要資料庫來儲存資訊
為聯絡簿建立資料表
聯絡卡上的欄位是 People 資料表裡的資料欄
完成資料表的建立
...