更鋒利的C#代碼

出版時(shí)間:2008-10  出版社:清華大學(xué)出版社  作者:包善東  頁(yè)數(shù):326  
Tag標(biāo)簽:無(wú)  

前言

  這是一本以C#語(yǔ)言為基礎(chǔ),著眼于代碼質(zhì)量的編程指導(dǎo)。雖然沒(méi)有磚頭書(shū)的厚重,但卻匯集了許許多多開(kāi)發(fā)人員大量的實(shí)踐經(jīng)驗(yàn)。每個(gè)章節(jié)的內(nèi)容似乎都為大家所熟悉,然而視角卻完全不同,通過(guò)對(duì)那些幾乎被人們忽視了的細(xì)節(jié)的精心處理,不斷地提高每一行代碼的質(zhì)量。相信無(wú)論是C#初學(xué)者,還是具有NET經(jīng)驗(yàn)的開(kāi)發(fā)人員,都能從本書(shū)中得到啟發(fā),寫(xiě)出質(zhì)量更好的代碼,開(kāi)發(fā)出更加專(zhuān)業(yè)的程序。

內(nèi)容概要

  《更鋒利的C#代碼:編寫(xiě)高質(zhì)量C#程序》由淺入深、由表及里地講述存在于C#編碼開(kāi)發(fā)中的各種質(zhì)量問(wèn)題,讓讀者清楚地了解什么是應(yīng)該做的,什么是不應(yīng)該做的。C#提供的每種語(yǔ)言機(jī)制的功能背后,體現(xiàn)了怎樣的邏輯含義。當(dāng)遇到具體的問(wèn)題時(shí),應(yīng)該如何選擇與取舍。閱讀完此書(shū)的每一個(gè)章節(jié),都會(huì)讓讀者站在更高的角度C#體系擁有更深的認(rèn)識(shí)和把握,不斷向軟件開(kāi)發(fā)的更高層次邁進(jìn)。一個(gè)好的程序,不僅僅是能得出正確的運(yùn)行結(jié)果,而且還應(yīng)在其內(nèi)部保持清晰的代碼邏輯和語(yǔ)義,否則,跟隨在正常結(jié)果之后的也許是艱難的代碼維護(hù)工作,對(duì)程序進(jìn)行一處修改往往會(huì)牽一發(fā)而動(dòng)全身,一不小心就會(huì)埋下深深的陷患。從另一個(gè)角度來(lái)說(shuō),如果每一行代碼的質(zhì)量都很高,那么這個(gè)軟件產(chǎn)品也一定是高質(zhì)量的。這就像ISO9000的質(zhì)量體系認(rèn)證一樣,與其在產(chǎn)品生產(chǎn)完成之后再進(jìn)行檢驗(yàn),不如控制每一步生產(chǎn)環(huán)節(jié)的質(zhì)量。

作者簡(jiǎn)介

  包善東(網(wǎng)名Richard Bao),群碩軟件開(kāi)發(fā)有限公司的一名交互設(shè)計(jì)師和軟件工程師。9歲時(shí)萌生了對(duì)編程的濃厚興趣,從此走上了軟件開(kāi)發(fā)的道路,至今已積累了十多年的編程經(jīng)驗(yàn)。作者還曾是其學(xué)校交響樂(lè)團(tuán)的大提琴兼鋼琴演奏員,在英、法、德、港、臺(tái)及內(nèi)地多次進(jìn)行演出。也許是音樂(lè)與藝術(shù)思想對(duì)編程的滲透,使其在編程中往往善于尋找和諧之美,避免一切生搬硬套。這也許才是《更鋒利的C#代碼》思想的根源吧。

書(shū)籍目錄

第1章 基本的代碼風(fēng)格1.1 換行的講究1.1.1 尋找最佳的斷行位置1.1.2 每行只寫(xiě)一條語(yǔ)句1.1.3 分行定義變量1.2 避免代碼過(guò)于擁擠1.2.1 使用空行分隔代碼塊1.2.2 使用空格降低代碼密度1.3如何縮進(jìn)1.3.1 嵌套或包含關(guān)系引起的縮進(jìn)1.3.2 因換行而產(chǎn)生的縮進(jìn)1.3.3 使用空格還是Tab鍵1.4 大括號(hào)1.4.1 大括號(hào)的位置1.4.2 空的大括號(hào)結(jié)構(gòu)1.4.3 僅包含單個(gè)語(yǔ)句的結(jié)構(gòu)體1.5 保持項(xiàng)目文件的條理性1.5.1 解決方案的結(jié)構(gòu)呼應(yīng)1.5.2 代碼文件的結(jié)構(gòu)1.5.3 使用#region標(biāo)記來(lái)隱藏細(xì)節(jié)第2章 養(yǎng)成良好的注釋習(xí)慣2.1 何時(shí)需要注釋2.1.1 解釋代碼的意圖2.1.2 對(duì)局部變量的說(shuō)明2.1.3 充當(dāng)代碼標(biāo)題2.1.4 指出例外情況2.1.5 開(kāi)發(fā)過(guò)程的提示2.2 注釋的格式2.2.1 單行注釋2.2.2 多行注釋2.3 正確使用XML文檔注釋2.3.1 結(jié)構(gòu)與類(lèi)的XML文檔注釋2.3.2 屬性的XML文檔注釋2.3.3 方法的XML文檔注釋2.3.4 構(gòu)造函數(shù)的XML文檔注釋2.3.5 事件的XML文檔注釋2.3.6 枚舉類(lèi)型的XML文檔注釋2.3.7 泛型的XML文檔注釋2.3.8 其他標(biāo)記第3章一般命名規(guī)范3.1 選用合適的名稱(chēng)3.1.1 使用字符的限制3.1.2 使用含義明確的英語(yǔ)3.2 大小寫(xiě)規(guī)則3.2.1 Pascal規(guī)則3.2.2 Camel規(guī)則3.2.3 首字母縮寫(xiě)詞與簡(jiǎn)寫(xiě)詞3.2.4 應(yīng)在何時(shí)使用何種大小寫(xiě)規(guī)則3.3 考慮跨語(yǔ)言編程3.3.1 不要通過(guò)大小寫(xiě)區(qū)分標(biāo)識(shí)符3.3.2 避免與其他語(yǔ)言的關(guān)鍵字重復(fù)3.3.3 避免使用特定語(yǔ)言的術(shù)語(yǔ)3.4 命名一致與沖突3.4.1 大小寫(xiě)無(wú)關(guān)原則3.4.2 對(duì)基類(lèi)型的命名暗示3.4.3 對(duì)參數(shù)與屬性的關(guān)系暗示3.4.4 屬性名稱(chēng)與自身類(lèi)型同名3.4.5 與命名空間相關(guān)的命名沖突3.5 匈牙利命名法3.5.1 匈牙利命名法的弊端3.5.2 考慮為控件應(yīng)用匈牙利命名法第4章處理數(shù)據(jù)4.1 關(guān)于數(shù)據(jù)類(lèi)型4.1.1 整數(shù)4.1.2 浮點(diǎn)數(shù)4.1.3 布爾類(lèi)型4.1.4 字符與字符串4.2 變量的使用4.2.1 盡可能使用內(nèi)置關(guān)鍵字4.2.2初始化一切變量4.2.3 集中使用變量4.3 使用枚舉4.3.1 何時(shí)使用枚舉4.3.2 如何為枚舉命名4.3.3 關(guān)于枚舉項(xiàng)4.3.4 標(biāo)記枚舉4.4 魔數(shù)——以字面數(shù)值出現(xiàn)在代碼中的常量4.5 復(fù)雜的表達(dá)式4.5.1 運(yùn)算符的副作用4.5.2簡(jiǎn)化表達(dá)式第5章分支結(jié)構(gòu)5.1 使用if結(jié)構(gòu)5.1.1“==”與“=”的問(wèn)題5.1.2 如何處理復(fù)雜的條件5.2 使用switch結(jié)構(gòu)5.2.1 break語(yǔ)句5.2.2 使用default子句要注意的問(wèn)題5.3 選擇if還是switch5.4 關(guān)于判斷順序的設(shè)計(jì)5.4.1 先判斷最有可能成立的條件5.4.2 預(yù)防因條件短路而丟失操作5.5 慎用goto語(yǔ)句第6章 循環(huán)結(jié)構(gòu)6.1 使用for還是while6.1.1 for和while的語(yǔ)義比較6.1.2 簡(jiǎn)單的數(shù)值迭代——for和while的思維模式的差j6.1.3 預(yù)知循環(huán)次數(shù)——微波爐加熱的啟示6.1.4 集合迭代——獨(dú)特的foreach結(jié)構(gòu)6.2 循環(huán)變量的使用6.2.1 循環(huán)變量的命名6.2.2 循環(huán)變量的定義6.2.3 避免循環(huán)變量的非常規(guī)應(yīng)用6.3 提高循環(huán)效率6.3.1 避免不必要的重復(fù)勞動(dòng)6.3.2 避免不必要的循環(huán)第7章 如何使用函數(shù)7.1 為什么要使用函數(shù)7.1.1 函數(shù)與方法7.1.2 代碼復(fù)用7.1.3 隱藏細(xì)節(jié)——使用函數(shù)進(jìn)行抽象7.2 函數(shù)重載7.2.1 重載的語(yǔ)義——為調(diào)用者提供方便7.2.2 保持核心代碼唯一7.3 參數(shù)的設(shè)計(jì)7.3.1 參數(shù)的命名7.3.2 不要使用保留項(xiàng).7.3.3 何時(shí)使用變長(zhǎng)參數(shù)列表7.3.4 何時(shí)使用ref參數(shù)和out參數(shù)7.3.5參數(shù)的順序7.3.6 重載函數(shù)的參數(shù)一致性體現(xiàn)7.4 參數(shù)檢查的必要性7.4.1 檢查零值及空引用7.4.2 檢查枚舉類(lèi)型7.4.3 防止數(shù)據(jù)被篡改7.4.4 在何處檢查合法性7.5 函數(shù)的出口——離開(kāi)函數(shù)的三種方式7.5.1 返回值的用法7.5.2 離開(kāi)函數(shù)的時(shí)機(jī)第8章 結(jié)構(gòu)與類(lèi)8.1 結(jié)構(gòu)與類(lèi)的比較8.1.1 值類(lèi)型與引用類(lèi)型8.1.2 何時(shí)應(yīng)當(dāng)使用結(jié)構(gòu)8.1.3 何時(shí)應(yīng)當(dāng)使用類(lèi)8.2 結(jié)構(gòu)與類(lèi)的命名8.2.1 措辭8.2.2 避免與命名空間沖突8.2.3 不要使用“C”前綴8.2.4后綴的使用8.3 如何搭建一個(gè)典型的結(jié)構(gòu)8.3.1 找準(zhǔn)核心數(shù)據(jù)8.3.2 數(shù)據(jù)的表現(xiàn)形式8.3.3 定義等價(jià)原則8.3.4實(shí)現(xiàn)基本運(yùn)算8.4 如何真正面向?qū)ο蟮?章 封裝9.1 構(gòu)造函數(shù)9.1.1 構(gòu)造函數(shù)的語(yǔ)義9.1.2 何時(shí)使用靜態(tài)構(gòu)造方法9.1.3 構(gòu)造函數(shù)的參數(shù)及其初始化9.2 Finalize函數(shù)9.2.1 垃圾回收器9.2.2 IDisposable接口——顯式釋放資源的方法9.2.3 釋放資源的一般范式9.3 何時(shí)應(yīng)該使用字段9.3.1 存儲(chǔ)核心數(shù)據(jù)9.3.2 維持中間結(jié)果9.3.3 常量字段9.4 如何使用字段9.4.1 字段的命名9.4.2 訪問(wèn)控制9.5 何時(shí)應(yīng)該使用屬性9.5.1 屬性的語(yǔ)義9.5.2 數(shù)據(jù)訪問(wèn)控制9.5.3 需要的后續(xù)操作9.5.4 簡(jiǎn)單的數(shù)據(jù)處理9.5.5 預(yù)定義的對(duì)象實(shí)例9.6 如何使用屬性9.6.1 屬性的命名9.6.2 訪問(wèn)控制9.6.3 提供合理的默認(rèn)值9.6.4 保持輕量級(jí)的操作9.6.5 在屬性中拋出異常9.7 何時(shí)應(yīng)該使用方法9.7.1 表示某種操作9.7.2 耗時(shí)的任務(wù)——方法在形式上的暗示作用9.7.3 有副作用的操作9.7.4 返回不確定的值9.7.5 返回?cái)?shù)組或集合對(duì)象9.8 如何使用方法9.8.1 方法的命名9.8.2 檢查傳入的參數(shù)9.9 靜態(tài)類(lèi)型及成員9.10 嵌套類(lèi)型及其適用場(chǎng)合9.11 可變類(lèi)型的安全性9.12 使用程序集與命名空間9.12.1 程序集的劃分9.12.2 為什么要使用命名空間9.12.3 命名空間的命名9.12.4 命名空間的管理第10章 繼承與多態(tài)10.1 如何利用類(lèi)繼承10.1.1 自上而下逐步細(xì)化10.1.2 自下而上逐步抽象10.2 繼承限制10.2.1 強(qiáng)制繼承的抽象類(lèi)型10.2.2 密封類(lèi)型10.2.3 擴(kuò)展方法——直接向已有類(lèi)型添加功能10.3 關(guān)于接口10.3.1 接口的語(yǔ)義10.3.2 接口的命名10.3.3 使用接口還是類(lèi)繼承10.4 何時(shí)應(yīng)當(dāng)顯式實(shí)現(xiàn)接口10.4.1 解決接口之間的命名沖突10.4.2 提供強(qiáng)類(lèi)型操作10.4.3 隱藏僅用于通過(guò)接口訪問(wèn)的成員10.5 使用多態(tài)10.5.1 何時(shí)應(yīng)進(jìn)行重寫(xiě)10.5.2 應(yīng)當(dāng)重寫(xiě)哪個(gè)成員10.5.3 保持參數(shù)名稱(chēng)一致10.6運(yùn)算符重載10.6.1 可重載的運(yùn)算符10.6.2 符合運(yùn)算符的本意10.6.3 運(yùn)算符的關(guān)聯(lián)性10.6.4 類(lèi)型轉(zhuǎn)換運(yùn)算符的重載第11章 泛型機(jī)制11.1 裝箱與取消裝箱11.2 何時(shí)使用泛型11.3 泛型的類(lèi)型參數(shù)設(shè)計(jì)11.3.1 類(lèi)型參數(shù)的命名11.3.2 使用類(lèi)型參數(shù)的時(shí)機(jī)第12章 事件與委托12.1 何為事件驅(qū)動(dòng)模式12.2 如何響應(yīng)事件12.2.1 事件處理函數(shù)12.2.2代碼的分配12.2.3 事件偵聽(tīng)器的使用12.3如何提供事件12.3.1 何時(shí)應(yīng)當(dāng)提供事件12.3.2 事件的命名12.3.3 傳遞與事件相關(guān)的數(shù)據(jù)12.3.4 用于事件的委托及其要遵守的約定12.3.5 觸發(fā)事件12.4 使用委托12.4.1 何時(shí)使用委托12.4.2 何時(shí)使用匿名方法12.4.3 基類(lèi)型與派生類(lèi)型第13章 集合類(lèi)型13.1 系統(tǒng)內(nèi)置集合類(lèi)型13.1.1 數(shù)組13.1.2 列表13.1.3 字典13.1.4 其他類(lèi)型13.2 選用適當(dāng)?shù)募项?lèi)型要考慮的幾個(gè)方面13.2.1 容量13.2.2進(jìn)出次序13.2.3 定位的問(wèn)題——索引/鍵訪問(wèn)13.2.4 元素結(jié)構(gòu)13.2.5 排序13.3 性能比較13.4 提供自己的集合類(lèi)型13.4.1 何時(shí)應(yīng)提供集合類(lèi)型13.4.2 集合類(lèi)型的命名13.4.3 提供與內(nèi)置集合類(lèi)型一致的行為13.4.4 索引器及其應(yīng)遵守的規(guī)則13.4.5 迭代器第14章 LINQ查詢(xún)14.1 提高LINQ查詢(xún)的效率14.1.1 查詢(xún)語(yǔ)法和方法語(yǔ)法的區(qū)別14.1.2 LINQ查詢(xún)的創(chuàng)建、執(zhí)行與性能14.1.3 減少返回的數(shù)據(jù)量14.2 LINQ中的錯(cuò)誤處理一一采用防御式編程14.3 LINQ查詢(xún)的相關(guān)機(jī)制14.3.1 匿名類(lèi)型14.3.2 隱式類(lèi)型的局部變量14.3.3 Lambda表達(dá)式與匿名函數(shù)第15章 異常15.1 處理異常時(shí)應(yīng)遵守的規(guī)范15.2 拋出異常15.2.1 異常的語(yǔ)義15.2.2 不應(yīng)使用異常的位置15.2.3 控制異常15.2.4 異常的重新拋出——重新包裝時(shí)要注意的15.3 選用合適的異常類(lèi)型15.3.1 常見(jiàn)的異常類(lèi)型15.3.2 不應(yīng)使用的異常類(lèi)型15.4 異常提示信息15.5 設(shè)計(jì)自定義異常及應(yīng)遵循的約定第16章 全球化與本地化16.1 分離與特定區(qū)域相關(guān)的信息16.2 處理特定區(qū)域性的數(shù)據(jù)16.2.1 區(qū)分區(qū)域性與界面區(qū)域性16.2.2 在內(nèi)部使用Unicode16.2.3 文本的比較與排序16.2.4 不要假定區(qū)域性的行為16.3 何時(shí)使用固定區(qū)域性16.4 用戶(hù)界面應(yīng)注意的細(xì)節(jié)16.4.1 使用資源16.4.2 術(shù)語(yǔ)16.4.3 界面布局16.4.4 歧義16.4.5 組合文本附錄A:C#、VB.NET、J#關(guān)鍵字表附錄B:常用的異常類(lèi)型

章節(jié)摘錄

  第1章基本的代碼風(fēng)格  假設(shè)我們寫(xiě)的是文章而不是程序,那么你一定覺(jué)得諸如文章應(yīng)該分為若干個(gè)自然段、每段開(kāi)頭空兩格之類(lèi)的規(guī)則是理所當(dāng)然的。如果段落的開(kāi)頭不空兩格,或者干脆把整個(gè)文章寫(xiě)成單獨(dú)的一段,仔細(xì)想來(lái)似乎也不會(huì)影響文章實(shí)質(zhì)內(nèi)容的表達(dá)。既然如此,我們?yōu)槭裁催€要在形式上下功夫呢?設(shè)想一下,如果你手中的這本書(shū)既無(wú)章節(jié)也無(wú)目錄,正文中的不同內(nèi)容都使用同樣的字體字號(hào)印刷,幾百頁(yè)紙從頭至尾洋洋灑灑如念經(jīng)般地“一氣呵成”,你還有耐心看下去嗎?  這是一個(gè)人人都能理解的道理,可是當(dāng)文章變成程序的時(shí)候,就不是每個(gè)人都能想得通的了。不僅僅是初學(xué)者,甚至一些熟練的開(kāi)發(fā)人員,也會(huì)寫(xiě)出凌亂不堪的代碼。許多人一定有過(guò)這樣的經(jīng)歷:一年半載之后,自己原來(lái)寫(xiě)的程序就完全看不懂了。如果這段程序只是為了交作業(yè),或者臨時(shí)一用,那還可以不去追究,但如果這是一個(gè)商業(yè)軟件,現(xiàn)在需要根據(jù)客戶(hù)的要求進(jìn)行修改的話,工作量可就大了——你不得不先花時(shí)間把你原來(lái)的思路看懂?! 】隙〞?huì)有人反駁:代碼是給機(jī)器運(yùn)行的,又不是給人看的,寫(xiě)那么好看有什么用?  他的話只對(duì)了前半句:代碼確實(shí)是給機(jī)器運(yùn)行的,可是機(jī)器總共才需要看它幾分鐘?你花一個(gè)月編寫(xiě)的程序,機(jī)器頂多兩三分鐘就編譯好了——在這兩三分鐘之前,這代碼不都是你在看嗎?開(kāi)發(fā)軟件編寫(xiě)代碼不是一朝一夕的事情,更多的情況下,一個(gè)軟件的開(kāi)發(fā)要經(jīng)歷很長(zhǎng)的時(shí)間,并且常常由多人合作完成。一個(gè)龐大的軟件項(xiàng)目,可能會(huì)動(dòng)用上千名程序員工作數(shù)年!如果把代碼寫(xiě)得連自己都看不明白,怎么與別人交流?同一個(gè)開(kāi)發(fā)團(tuán)隊(duì)內(nèi),一定要保持良好且一致的代碼風(fēng)格,才能最大化地提高開(kāi)發(fā)效率?! ∮械某鯇W(xué)者會(huì)問(wèn):我現(xiàn)在只是一個(gè)人寫(xiě)程序,并不需要和其他人合作,這些條條框框還有什么必要嗎?  要知道,團(tuán)隊(duì)協(xié)作只是一個(gè)方面。我經(jīng)常遇到這類(lèi)情況,一些初學(xué)者拿著他的程序來(lái)說(shuō):“這個(gè)怎么不能編譯?”我?guī)退汛a整理了半天,發(fā)現(xiàn)有一個(gè)地方丟了半個(gè)大括號(hào)。如果他寫(xiě)程序的時(shí)候能夠稍加注意一些的話,相信此類(lèi)錯(cuò)誤完全可以避免。保持良好的編程習(xí)慣,能夠避免的錯(cuò)誤還遠(yuǎn)不止這些。

編輯推薦

  《更鋒利的C#代碼:編寫(xiě)高質(zhì)量C#程序》由清華大學(xué)出版社出版?! ∫粋€(gè)好的程序,不僅僅是能得出正確的運(yùn)行結(jié)果。每個(gè)章節(jié)的內(nèi)容似乎都為大家所熟悉,然而視角完全不同。通過(guò)對(duì)那些幾乎被人們忽視了的細(xì)節(jié)的精心處理,不斷地提高每一行代碼的質(zhì)量。它們?yōu)槭裁幢仨毷?,而并非形式主義。C#提供的每種語(yǔ)言機(jī)制的功能背后,體現(xiàn)了怎樣的邏輯含義。讀完此書(shū),你會(huì)站在更高的角度與C#體系擁有更深的認(rèn)識(shí)和把握。

圖書(shū)封面

圖書(shū)標(biāo)簽Tags

無(wú)

評(píng)論、評(píng)分、閱讀與下載


    更鋒利的C#代碼 PDF格式下載


用戶(hù)評(píng)論 (總計(jì)0條)

 
 

 

250萬(wàn)本中文圖書(shū)簡(jiǎn)介、評(píng)論、評(píng)分,PDF格式免費(fèi)下載。 第一圖書(shū)網(wǎng) 手機(jī)版

京ICP備13047387號(hào)-7