 |
-- 會員 / 註冊 --
|
|
|
|
C# 7.0本質論 ( 簡體 字) |
作者:[美] 馬克米凱利斯(Mark Michaelis)著 | 類別:1. -> 程式設計 -> .NET -> C# |
譯者: |
出版社:機械工業出版社 | 3dWoo書號: 51130 詢問書籍請說出此書號!【缺書】 NT售價: 995 元 |
出版日:5/1/2019 |
頁數:690 |
光碟數:0 |
|
站長推薦:  |
印刷:黑白印刷 | 語系: ( 簡體 版 ) |
|
加入購物車 │加到我的最愛 (請先登入會員) |
ISBN:9787111625681 |
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 序 |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證) |
作者序: |
譯者序: |
前言:在軟件工程的發展歷史中,用于編寫計算機程序的方法經歷了幾次思維模式的重大轉變。每種思維模式都以前一種為基礎,宗旨都是增強代碼的組織,并降低復雜性。本書將帶領你體驗相同的思維模式轉變過程。
本書開始幾章會指導你學習順序編程結構。在這種編程結構中,語句按編寫順序執行。該結構的問題在于,隨著需求的增加,復雜性也指數級增加。為降低復雜性,將代碼塊轉變成方法,產生了結構化編程模型。在這種模型中,可以從一個程序中的多個位置調用同一個代碼塊,不需要復制。但即使有這種結構,程序還是會很快變得臃腫不堪,需進一步抽象。所以,在此基礎上人們又提出了面向對象編程的概念,這將在第6章開始討論。在此之后,你將繼續學習其他編程方法,比如基于接口的編程和LINQ(以及它促使集合API發生的改變),并最終學習通過特性(attribute)進行初級的聲明性編程(第18章)。
本書有以下三個主要職能。
全面講述C#語言,其內容已遠遠超過了一本簡單的教程,為你進行高效率軟件開發打下堅實基礎。
對于已熟悉C#的讀者,本書探討了一些較為復雜的編程思想,并深入討論了語言最新版本(C# 7.0和.NET Framework 4.7/.NET Core 2.0)的新功能。
它是你永遠的案頭參考—即便在你精通了這種語言之后。
成功學習C#的關鍵在于,要盡可能快地開始編程。不要等自己成為一名理論“專家”之后才開始寫代碼。所以不要猶豫,馬上開始寫程序吧。作為迭代開發思想的追隨者,我希望即使一名剛開始學習編程的新手,在第2章結束時也能動手寫基本的C#代碼。
許多主題本書沒有討論。你在本書中找不到ASP.NET、ADO.NET、Xamarin、智能客戶端開發以及分布式編程等主題。雖然這些主題與.NET有關,但它們都值得用專門的書分專題講述。幸好市面上已經有豐富的圖書供讀者選擇。本書重點在于C#及基類庫中的類型。讀完本書之后,你在上述任何領域繼續深入學習都會有游刃有余的感覺。
本書面向的讀者
寫作本書時,我面臨的一個挑戰是如何在持續吸引高級開發人員眼球的同時,不因使用assembly、link、chain、thread和fusion等字眼而打擊初學者的信心,否則許多人會以為這是一本講冶金而不是程序設計的書。本書的主要讀者是已經有一定編程經驗,并想多學一種語言來“傍身”的開發者。但我還是小心地編排了本書的內容,使之對各種層次的開發者都有足夠大的價值。
初學者:假如你是編程新手,本書將幫助你從入門級程序員過渡為C#開發者,消除以后在面臨任何C#編程任務時的害怕心理。本書不僅要教會你語法,還要教你養成良好的編程習慣,為將來的編程生涯打下良好基礎。
熟悉結構化編程的程序員:學習外語最好的方法就是“沉浸法”。類似地,學習一門計算機語言最好的方法就是在動手中學習,而不是等熟知了它的所有“理論”之后再動手。基于這個前提,本書最開始的內容是那些熟悉結構化編程的開發者很容易上手的。到第5章結束時,這些開發者應該可以開始寫基本的控制流程序。然而,要成為真正的C#開發者,記住語法只是第一步。為了從簡單程序過渡到企業級開發,C#開發者必須熟練從對象及其關系的角度來思考問題。為此,第6章的“初學者主題”開始介紹類和面向對象開發。歷史上的C、COBOL和FORTRAN等結構化編程語言雖然仍在發揮作用,但作用會越來越小,所以,軟件工程師們應該逐漸開始了解面向對象開發。C#是進行這一思維模式轉變的理想語言,因為它本來就是基于“面向對象開發”這一中心思想來設計的。
熟悉“基于對象”和“面向對象”理念的開發者:C++、Python、TypeScript、Visual Basic和Java程序員都可歸于此類。對于分號和大括號,他們可是一點兒都不陌生!簡單瀏覽一下第1章的代碼,你會發現,從核心上講,C#類似于你熟知的C和C++風格的語言。
C#專家:對于已經精通C#的讀者,本書可供你參考不太常見的語法。此外,對于在其他地方強調較少的一些語言細節以及微妙之處,我提出了自己的見解。最重要的是,本書提供了編寫可靠和易維護代碼的指導原則及模式。在你教別人學C#時,本書也頗有助益。從C# 3.0到C# 7.0最重要的一些增強包括:
字符串插值(第2章)
隱式類型的變量(第3章)
元組(第3章)
模式匹配(第4章)
擴展方法(第6章)
分部方法(第6章)
泛型(第12章)
Lambda語句和表達式(第13章)
表達式樹(第13章)
匿名類型(第15章)
標準查詢操作符(第15章)
查詢表達式(第16章)
動態編程(第18章)
用任務編程庫(TPL)和async進行多線程編程(第19章)
用PLINQ進行并行查詢處理(第19章)
并發集合(第20章)
考慮到許多人還不熟悉這些主題,本書圍繞它們展開了詳細的討論。涉及高級C#開發的還有“指針”這一主題,該主題將在第21章討論。即使是有經驗的C#開發者,也未必能很透徹地理解這一主題。
本書特色
本書是語言參考書,遵循核心《C#語言7.0規范》(C# Language 7.0 Specification)。為了幫助讀者理解各種C#構造,書中用大量例子演示了每一種特性,而且為每個概念都提供了相應的指導原則和最佳實踐,以確保代碼能順利編譯,避免留下隱患,并獲得最佳的可維護性。
為增強可讀性,所有代碼均進行了特殊格式處理,而且每章內容都用思維導圖來概括。
C#設計規范
本書新版本最重大的改進之一就是增加了大量“設計規范”,下面是取自第17章的例子。
設計規范
要確保相等的對象有相等的哈希碼。
要確保對象在哈希表中時哈希碼永不變化。
要確保哈希算法快速生成良好分布的哈希碼。
要確保哈希算法在任何可能的對象狀態中的健壯性。
區分知道語法的程序員和能因地制宜寫出最高效代碼的專家的關鍵就是這些設計規范。專家不僅能讓代碼通過編譯,還會遵循最佳實踐,降低出現bug的概率,并使代碼的維護變得更容易。設計規范強調了一些關鍵原則,開發時務必注意。
示例代碼
本書大多數代碼都能在公共語言基礎結構(Common Language Infrastructure,CLI)的任何實現上運行,但重點還是Microsoft .NET Framework和.NET Core這兩個實現。很少使用平臺或廠商特有的庫,除非需要解釋只和那些平臺相關的重要概念(例如,解釋如何正確處理Windows單線程UI)。
下面是一個示例代碼清單。
代碼清單1.19 注釋代碼
下面解釋具體的格式:
注釋使用斜體。
關鍵字加粗。
有的代碼突出顯示,是為了指出這些代碼與之前的有區別,或是為了演示正文介紹的概念。
突出顯示的可能是一整行,也可能是一行中的幾個字符。
省略號表示無關代碼已省略。
代碼清單后列出了對應的控制臺輸出。由用戶輸入的內容加粗。
輸出1.7
雖然我也可以在書中提供完整代碼以方便復制,但這樣會分散大家的注意力。因此,你需要在自己的程序中修改示例代碼。書中的代碼主要省略了錯誤檢查,比如異常處理。另外,代碼沒有顯式包含using System語句,所有例子都需要該語句。
請訪問https://github.com/IntelliTect/EssentialCSharp或http://bookzhou.com下載示例代碼。
思維導圖
每章開頭都有一幅“思維導圖”作為提綱,目的是為讀者提供針對每章內容的快速參考。下面是一個例子(摘自第6章)。
每章主題顯示在思維導圖的中心,高級主題圍繞中心展開。利用思維導圖,讀者可方便地搭建自己的知識體系,可以從一個主題出發,更清楚地理解其周邊的各個具體概念,避免中途糾纏于一些不相干的枝節問題。
分類解說
根據編程水平的不同,可以利用書中的標志來幫助自己輕松找到適合自己的內容。
初學者主題:特別針對入門級程序員提供的定義或解釋。
高級主題:可以讓有經驗的開發者將注意力放在他們最關心的內容上。
標注:用有底紋的標注框強調關鍵點,引起讀者的注意。
語言對比:分散在正文中的補充內容描述了C#和其他語言的關鍵差異,為熟悉其他語言的讀者提供指引。
本書內容組織
總體來說,軟件工程的宗旨就是管理復雜性。本書基于該宗旨來組織內容。第1章∼第5章介紹結構化編程,學習這些內容后,可以立即開始寫一些功能簡單的代碼。第6章∼第10章介紹C#的面向對象構造,新手應在完全理解這幾章的內容之后,再開始接觸本書其余部分更高級的主題。第12章∼第14章介紹更多用于降低復雜性的構造,講解當今幾乎所有程序都要用到的通用設計模式。理解了它們之后,才可以更輕松地理解如何通過反射和特性來進行動態編程。后續章節將廣泛運用它們來實現線程處理和互操作性。
本書最后專門用一章(第22章)講解CLI。這一章在開發平臺的背景下對C#語言進行了描述。之所以要放到最后,是因為它非C#特有,且不涉及語法和編程風格問題。不過,本章適合在任何時候閱讀,或許最恰當的時機是在閱讀完第1章之后。
下面是每一章的內容提要。(加黑的標題表明那一章含有C# 6.0和C# 7.0的內容。)
第1章—C#概述:本章在展示了用C#寫的HelloWorld程序之后對其進行細致分析。目的是讓讀者熟悉C#程序的“外觀和感覺”,并理解如何編譯和調試自己的程序。另外,還簡單描述了執行C#程序的上下文及其中間語言(Intermediate Language,IL)。
第2章—數據類型:任何有用的程序都要處理數據,本章介紹了C#的基元數據類型。
第3章—更多數據類型:本章深入講解數據類型的兩大類別:值類型和引用類型。然后講解了可空修飾符以及C# 7.0引入的元組。最后深入討論了基元數組結構。
第4章—操作符和控制流:計算機最擅長重復性操作,為利用該能力,需知道如何在程序中添加循環和條件邏輯。本章還討論了C#操作符、數據轉換和預處理器指令。
第5章—方法和參數:本章討論了方法及其參數的細節,其中包括通過參數來傳值、傳引用和通過out參數返回數據。C# 4.0新增了默認參數,本章將解釋如何使用。
第6章—類:前面已學過類的基本構成元素,本章合并這些構造,以獲得具有完整功能的類型。類是面向對象技術的核心,它定義了對象模板。
第7章—繼承:繼承是許多開發者的基本編程手段,C#更是提供了一些獨特構造,比如new修飾符。本章討論了繼承語法的細節,其中包括重寫(overriding)。
第8章—接口:本章討論如何利用接口來定義類之間的“可進行版本控制的交互契約”(versionable interaction contract)。C#同時包含顯式和隱式接口成員實現,可實現一個額外的封裝等級,這是其他大多數語言所不支持的。
第9章—值類型:盡管不如定義引用類型那么頻繁,但有時確有必要定義行為和C#內置基元類型相似的值類型。本章介紹如何定義結構(struct),同時也強調其特殊性。
第10章—合式類型:本章討論了更高級的類型定義,解釋如何實現操作符,比如+和轉型操作符,并描述如何將多個類封裝到一個庫中。此外,還演示了如何定義命名空間和XML注釋,并討論如何基于垃圾回收機制來設計令人滿意的類。
第11章—異常處理:本章延伸討論第5章引入的異常處理機制,描述了如何利用異常層次結構創建自定義異常。此外,還強調了異常處理的一些最佳實踐。
第12章—泛型:泛型或許是C# 1.0最缺少的功能。本章全面討論自2.0引入的泛型機制。此外,C# 4.0增加了對協變和逆變的支持,本章將在泛型背景中探討它們。
第13章—委托和Lambda表達式:正因為委托,才使C#與其前身語言(C和C++等)有了顯著不同,它定義了在代碼中處理事件的模式。這幾乎完全消除了寫輪詢例程的必要。Lambda表達式是使C# 3.0的LINQ成為可能的關鍵概念。通過學習本章,你將知道Lambda表達式是在委托的基礎上構建起來的,它提供了比委托更優雅和簡潔的語法。本章內容是第14章討論的新的集合API的基礎。本章還強調了匿名方法應該用新的Lambda表達式代替。
第14章—事件:封裝起來的委托(稱為事件)是公共語言運行時(Common Language Runtime,CLR)的核心構造。
第15章—支持標準查詢操作符的集合接口:通過討論新的Enumerable類的擴展方法,介紹C# 3.0引入的一些簡單而強大的改變。Enumerable類造就了全新的集合API,即“標準查詢操作符”,本章對其進行詳細討論。
第16章—使用查詢表達式的LINQ:如果只使用標準查詢操作符,會形成讓人難以辨認的長語句。查詢表達式提供了一種類似SQL風格的語法,有效解決了該問題。本章會詳細討論這種表達式。
第17章—構建自定義集合:構建用于操縱業務對象的自定義API時,經常需要創建自定義集合。本章討論了具體做法,還介紹了能使自定義集合的構建變得更簡單的上下文關鍵字。
第18章—反射、特性和動態編程:20世紀80年代末,程序結構的思維模式發生了根本性的變化,面向對象的編程是這個變化的基礎。類似地,特性(attribute)使聲明性編程和嵌入元數據成為可能,因而引入了一種新的思維模式。本章探討了特性的方方面面,并討論了如何通過反射機制來獲取它們。本章還討論了如何通過基類庫(Base Class Library,BCL)中的序列化框架來實現文件的輸入輸出。C# 4.0新增了dynamic關鍵字,能將所有類型檢查都移至運行時進行,因而極大地擴展了C#的能力。
第19章—多線程處理:大多數現代程序都要求用線程執行長時間運行的任務,同時確保對并發事件的快速響應。隨著程序越來越復雜,必須采取其他措施來保護這些高級環境中的數據。多線程應用程序的編寫比較復雜。本章討論了如何操縱線程,并提供一些最佳實踐來避免將多線程應用程序弄得一團糟。
第20章—線程同步:本章以第19章為基礎,演示如何利用一些內建線程處理模式來簡化對多線程代碼的顯式控制。
第21章—平臺互操作性和不安全的代碼:必須意識到C#是相對年輕的一種語言,許多現有的代碼是用其他語言寫成的。為了用好這些現有代碼,C#通過P/Invoke提供了對互操作性(調用非托管代碼)的支持。此外,C#允許使用指針,也允許執行直接內存操作。雖然使用了指針的代碼要求特殊權限才能運行,但它具有與C風格的API完全兼容的能力。
第22章—公共語言基礎結構(CLI):事實上,C#被設計成一種在CLI頂部工作的最有效的編程語言。本章討論了C#程序與底層“運行時”及其規范的關系。
希望本書能作為你建立C#專業能力的豐富資源,并且在精通C#后你仍能將其作為對較少使用的領域的參考。
Mark Michaelis
IntelliTect.com/mark |
內容簡介:本書由世界級C#技術專家親筆撰寫,C#編譯器團隊開發人員技術審校,微軟公司C#項目經理作序推薦,10余年全球暢銷不衰,廣受好評。
全書共22章。第1章是C#概述;第2章和第3章介紹C#中的數據類型;第4章討論操作符、數據轉換和預處理器指令;第5章探討方法和參數的細節;第6章講解類,它是面向對象技術的核心;第7章介紹繼承,其中包括繼承語法的細節;第8章講解接口;第9章和第10章分別介紹值類型與合式類型,解釋如何定義結構、如何實現操作符;第11章延伸討論第5章引入的異常處理機制;第12章探討泛型;第13章講解委托和Lambda表達式;第14章討論事件;第15章介紹支持標準查詢操作符的集合接口;第16章探討使用查詢表達式的LINQ;第17章講解如何構建自定義集合;第18章介紹反射、特性和動態編程的方方面面;第19章涵蓋多線程處理;第20章以第19章為基礎,演示線程同步的用法;第21章涵蓋平臺互操作性和不安全的代碼;第22章講解公共語言基礎結構,并討論C#程序與底層“運行時”及其規范的關系。
Mark非常聰明,善于打破砂鍋問到底,能深刻理解一種技術對于真正的開發人員的影響……他的文字直指技術的本質,敏銳地指出技術的真正價值和問題……沒人能像這位大師一樣幫你正確理解C# 7.0。
—— Mads Torgersen,微軟公司C# 項目經理
作為歷年來深受各層次開發人員歡迎的C#指南,本書討論了從C# 3.0到C# 7.0中最重要的C#特性,強調了現代編程模式,教你如何編寫簡潔、強大、健壯、安全且易于維護的C#代碼。
世界級C#專家Mark Michaelis對C#語言進行了全面而深入的探討,提供了針對關鍵C# 7.0增強、C# 7.0和.NET Core/.NET Standard的配合使用以及跨平臺編譯的專業論述。他用簡潔的例子闡釋了關鍵C#構造,并提供了大量優秀實踐編程規范,為你進行高效軟件開發打好基礎。
本書特色
深挖C# 7.0的諸多改進,包括元組、解構函數、模式匹配、本地函數和ref返回等
利用C#面向對象構造寫出更健壯的代碼
利用泛型、委托、Lambda表達式和事件降低代碼復雜度
利用C# 7.0跨平臺編譯在Linux或MacOS上運行代碼
全面掌握多線程處理和同步,包括async/await模式
包括C# 7.1/7.2/7.3語言增強 |
目錄:譯者序 推薦序 前言 致謝 作者簡介 第1章 C#概述 / 1 1.1 Hello, World / 1 1.2 C#語法基礎 / 8 1.3 使用變量 / 14 1.4 控制臺輸入和輸出 / 17 1.5 注釋 / 20 1.6 托管執行和CLI / 22 1.7 多個.NET框架 / 26 1.8 小結 / 28 第2章 數據類型 / 29 2.1 基本數值類型 / 29 2.2 更多基本類型 / 36 2.3 null和void / 46 2.4 數據類型轉換 / 47 2.5 小結 / 52 第3章 更多數據類型 / 53 3.1 類型的劃分 / 53 3.2 可空修飾符 / 55 3.3 元組 / 57 3.4 數組 / 62 3.5 小結 / 74 第4章 操作符和控制流程 / 75 4.1 操作符 / 75 4.2 控制流程概述 / 87 4.3 代碼塊({}) / 91 4.4 代碼塊、作用域和聲明空間 / 93 4.5 布爾表達式 / 94 4.6 按位操作符(<<,>>,|,&,^,~) / 101 4.7 控制流程語句(續) / 106 4.8 跳轉語句 / 115 4.9 C#預處理器指令 / 119 4.10 小結 / 124 第5章 方法和參數 / 126 5.1 方法的調用 / 127 5.2 方法的聲明 / 131 5.3 using指令 / 135 5.4 Main()的返回值和參數 / 139 5.5 高級方法參數 / 141 5.6 遞歸 / 149 5.7 方法重載 / 152 5.8 可選參數 / 154 5.9 用異常實現基本錯誤處理 / 157 5.10 小結 / 168 第6章 類 / 169 6.1 類的聲明和實例化 / 172 6.2 實例字段 / 174 6.3 實例方法 / 176 6.4 使用this關鍵字 / 177 6.5 訪問修飾符 / 183 6.6 屬性 / 184 6.7 構造函數 / 197 6.8 靜態成員 / 205 6.9 擴展方法 / 213 6.10 封裝數據 / 214 6.11 嵌套類 / 216 6.12 分部類 / 218 6.13 小結 / 222 第7章 繼承 / 223 7.1 派生 / 224 7.2 重寫基類 / 232 7.3 抽象類 / 242 7.4 所有類都從System.Object派生 / 246 7.5 使用is操作符驗證基礎類型 / 247 7.6 用is操作符進行模式匹配 / 248 7.7 switch語句中的模式匹配 / 248 7.8 使用as操作符進行轉換 / 250 7.9 小結 / 251 第8章 接口 / 252 8.1 接口概述 / 253 8.2 通過接口實現多態性 / 254 8.3 接口實現 / 258 8.4 在實現類和接口之間轉換 / 262 8.5 接口繼承 / 263 8.6 多接口繼承 / 265 8.7 接口上的擴展方法 / 265 8.8 通過接口實現多繼承 / 266 8.9 版本控制 / 269 8.10 比較接口和類 / 270 8.11 比較接口和特性 / 271 8.12 小結 / 271 第9章 值類型 / 272 9.1 結構 / 275 9.2 裝箱 / 279 9.3 枚舉 / 285 9.4 小結 / 293 第10章 合式類型 / 295 10.1 重寫object的成員 / 295 10.2 操作符重載 / 305 10.3 引用其他程序集 / 311 10.4 定義命名空間 / 318 10.5 XML注釋 / 320 10.6 垃圾回收 / 323 10.7 資源清理 / 325 10.8 推遲初始化 / 332 10.9 小結 / 333 第11章 異常處理 / 334 11.1 多異常類型 / 334 11.2 捕捉異常 / 336 11.3 常規catch塊 / 339 11.4 異常處理規范 / 341 11.5 自定義異常 / 343 11.6 重新拋出包裝的異常 / 346 11.7 小結 / 349 第12章 泛型 / 350 12.1 如果C#沒有泛型 / 350 12.2 泛型類型概述 / 355 12.3 約束 / 364 12.4 泛型方法 / 374 12.5 協變性和逆變性 / 377 12.6 泛型的內部機制 / 382 12.7 小結 / 385 第13章 委托和Lambda表達式 / 386 13.1 委托概述 / 387 13.2 聲明委托類型 / 390 13.3 Lambda表達式 / 396 13.4 匿名方法 / 401 13.5 小結 / 413 第14章 事件 / 414 14.1 使用多播委托編碼Publish-Subscribe模式 / 415 14.2 理解事件 / 426 14.3 小結 / 435 第15章 支持標準查詢操作符的集合接口 / 436 15.1 集合初始化器 / 437 15.2 IEnumerable使類成為集合 / 439 15.3 標準查詢操作符 / 444 15.4 匿名類型之于LINQ / 470 15.5 小結 / 477 第16章 使用查詢表達式的LINQ / 478 16.1 查詢表達式概述 / 478 16.2 查詢表達式只是方法調用 / 493 16.3 小結 / 494 第17章 構建自定義集合 / 496 17.1 更多集合接口 / 497 17.2 主要集合類 / 498 17.3 提供索引器 / 512 17.4 返回null或者空集合 / 515 17.5 迭代器 / 515 17.6 小結 / 527 第18章 反射、特性和動態編程 / 528 18.1 反射 / 528 18.2 特性 / 539 18.3 使用動態對象進行編程 / 557 18.4 小結 / 565 第19章 多線程處理 / 566 19.1 多線程處理基礎 / 568 19.2 使用System.Threading / 572 19.3 異步任務 / 577 19.4 取消任務 / 591 19.5 基于任務的異步模式 / 596 19.6 并行迭代 / 618 19.7 并行執行LINQ查詢 / 626 19.8 小結 / 630 第20章 線程同步 / 631 20.1 線程同步的意義 / 632 20.2 計時器 / 653 20.3 小結 / 655 第21章 平臺互操作性和不安全代碼 / 656 21.1 平臺調用 / 657 21.2 指針和地址 / 667 21.3 通過委托執行不安全代碼 / 674 21.4 小結 / 676 第22章 公共語言基礎結構 / 677 22.1 CLI的定義 / 677 22.2 CLI的實現 / 678 22.3 .NET Standard / 680 22.4 BCL / 681 22.5 將C#編譯成機器碼 / 681 22.6 運行時 / 682 22.7 程序集、清單和模塊 / 685 22.8 公共中間語言 / 687 22.9 公共類型系統 / 687 22.10 公共語言規范 / 688 22.11 元數據 / 688 22.12 .NET Native和AOT編譯 / 689 22.13 小結 / 689 |
序: |
|