《C# 7.0本質(zhì)論(英文版)》(《出師表》)
經(jīng)典原版書庫
C# 7.0本質(zhì)論
(英文版)
Essential C# 7.0
[美] 馬克·米凱利斯(Mark Michaelis)著
出版者的話
文藝復興以來,源遠流長的科學精神和逐步形成的學術(shù)規(guī)范,使西方國家在自然科學的各個領(lǐng)域取得了壟斷性的優(yōu)勢;也正是這樣的優(yōu)勢,使美國在信息技術(shù)發(fā)展的六十多年間名家輩出、獨領(lǐng)風騷。在商業(yè)化的進程中,美國的產(chǎn)業(yè)界與教育界越來越緊密地結(jié)合,計算機學科中的許多泰山北斗同時身處科研和教學的最前線,由此而產(chǎn)生的經(jīng)典科學著作,不僅擘劃了研究的范疇,還揭示了學術(shù)的源變,既遵循學術(shù)規(guī)范,又自有學者個性,其價值并不會因年月的流逝而減退。
近年,在全球信息化大潮的推動下,我國的計算機產(chǎn)業(yè)發(fā)展迅猛,對專業(yè)人才的需求日益迫切。這對計算機教育界和出版界都既是機遇,也是挑戰(zhàn);而專業(yè)教材的建設(shè)在教育戰(zhàn)略上顯得舉足輕重。在我國信息技術(shù)發(fā)展時間較短的現(xiàn)狀下,美國等發(fā)達國家在其計算機科學發(fā)展的幾十年間積淀和發(fā)展的經(jīng)典教材仍有許多值得借鑒之處。因此,引進一批國外優(yōu)秀計算機教材將對我國計算機教育事業(yè)的發(fā)展起到積極的推動作用,也是與世界接軌、建設(shè)真正的世界一流大學的必由之路。
機械工業(yè)出版社華章公司較早意識到“出版要為教育服務”。自1998年開始,我們就將工作重點放在了遴選、移譯國外優(yōu)秀教材上。經(jīng)過多年的不懈努力,我們與Pearson、McGraw-Hill、Elsevier、MIT、John Wiley & Sons、Cengage等世界著名出版公司建立了良好的合作關(guān)系,從它們現(xiàn)有的數(shù)百種教材中甄選出Andrew S. Tanenbaum、Bjarne Stroustrup、Brian W. Kernighan、Dennis Ritchie、Jim Gray、Afred V. Aho、John E. Hopcroft、Jeffrey D. Ullman、Abraham Silberschatz、William Stallings、Donald E. Knuth、John L. Hennessy、Larry L. Peterson等大師名家的一批經(jīng)典作品,以“計算機科學叢書”為總稱出版,供讀者學習、研究及珍藏。大理石紋理的封面,也正體現(xiàn)了這套叢書的品位和格調(diào)。
華章網(wǎng)站:www.hzbook.com
電子郵件:hzjsj@hzbook.com
聯(lián)系電話:(010)88379604
聯(lián)系地址:北京市西城區(qū)百萬莊南街1號
郵政編碼:100037
序
2005年LINQ(語言集成查詢,Language Integrated Query)公布時,我才剛加入微軟公司,正好見證了PDC會議上令人激動的公開發(fā)布時刻。雖然我對技術(shù)本身幾乎沒有什么貢獻,但它的宣傳造勢我可是全程參加了。那時人人都在談論它,宣傳小冊子滿天飛。那是C#和.NET的大日子,至今依然令人難忘。
但會場的實踐實驗室區(qū)域卻相當安靜,那兒的人可以按部就班地試驗處于預覽階段的技術(shù)。我就是在那兒遇見Mark的。不用說,他一點兒都沒有按部就班的意思。他在做自己的試驗,梳理文檔,和別人溝通,忙著鼓搗自己的東西。
作為C#社區(qū)的新人,我感覺自己在那次會議上見到了許多人。但老實說,當時太混亂了,我唯一記得清的就是Mark。因為當問他是否喜歡這個新技術(shù)時,他不像別人那樣馬上開始滔滔不絕,而是非常冷靜地說:“還不確定,要自己搞一搞才知道。”他希望完整地理解并消化一種技術(shù),之后才將自己的想法告知于人。
所以我們之間沒像我本來設(shè)想的那樣發(fā)生一次快餐式的對話。相反,我們的對話相當坦誠、頗有營養(yǎng)。像這樣的交流好多年都沒有過了。新技術(shù)的細節(jié)、造成的后果和存在的問題全都涉及了。對我們這些語言設(shè)計者而言,Mark是最有價值的社區(qū)成員。他非常聰明,善于打破砂鍋問到底,能深刻理解一種技術(shù)對于真正的開發(fā)人員的影響。但是,最根本的原因可能還是他坦誠,他從不懼怕說出自己的想法。一樣東西通過了Mark的測試,就沒什么好擔心的了!
這些特質(zhì)也使Mark成為一名出色的作家。他的文字直指技術(shù)的本質(zhì),敏銳地指出技術(shù)的真正價值和問題,向讀者提供最完整的信息且沒有廢話。沒人能像這位大師一樣幫你正確理解C# 7.0。
請好好享用本書!
—Mads Torgersen,微軟公司C#項目經(jīng)理
前 言
在軟件工程的發(fā)展歷史中,用于編寫計算機程序的方法經(jīng)歷了幾次思維模式的重大轉(zhuǎn)變。每種思維模式都以前一種為基礎(chǔ),宗旨都是增強代碼的組織,并降低復雜性。本書將帶領(lǐng)你體驗相同的思維模式轉(zhuǎn)變過程。
本書開始幾章會指導你學習順序編程結(jié)構(gòu)。在這種編程結(jié)構(gòu)中,語句按編寫順序執(zhí)行。該結(jié)構(gòu)的問題在于,隨著需求的增加,復雜性也指數(shù)級增加。為降低復雜性,將代碼塊轉(zhuǎn)變成方法,產(chǎn)生了結(jié)構(gòu)化編程模型。在這種模型中,可以從一個程序中的多個位置調(diào)用同一個代碼塊,不需要復制。但即使有這種結(jié)構(gòu),程序還是會很快變得臃腫不堪,需進一步抽象。所以,在此基礎(chǔ)上人們又提出了面向?qū)ο缶幊痰母拍睿@將在第6章開始討論。在此之后,你將繼續(xù)學習其他編程方法,比如基于接口的編程和LINQ(以及它促使集合API發(fā)生的改變),并最終學習通過特性(attribute)進行初級的聲明性編程(第18章)。
本書有以下三個主要職能。
全面講述C#語言,其內(nèi)容已遠遠超過了一本簡單的教程,為你進行高效率軟件開發(fā)打下堅實基礎(chǔ)。
對于已熟悉C#的讀者,本書探討了一些較為復雜的編程思想,并深入討論了語言最新版本(C# 7.0和.NET Framework 4.7/.NET Core 2.0)的新功能。
它是你永遠的案頭參考—即便在你精通了這種語言之后。
成功學習C#的關(guān)鍵在于,要盡可能快地開始編程。不要等自己成為一名理論“專家”之后才開始寫代碼。所以不要猶豫,馬上開始寫程序吧。作為迭代開發(fā)思想的追隨者,我希望即使一名剛開始學習編程的新手,在第2章結(jié)束時也能動手寫基本的C#代碼。
許多主題本書沒有討論。你在本書中找不到ASP.NET、ADO.NET、Xamarin、智能客戶端開發(fā)以及分布式編程等主題。雖然這些主題與.NET有關(guān),但它們都值得用專門的書分專題講述。幸好市面上已經(jīng)有豐富的圖書供讀者選擇。本書重點在于C#及基類庫中的類型。讀完本書之后,你在上述任何領(lǐng)域繼續(xù)深入學習都會有游刃有余的感覺。
本書面向的讀者
寫作本書時,我面臨的一個挑戰(zhàn)是如何在持續(xù)吸引高級開發(fā)人員眼球的同時,不因使用assembly、link、chain、thread和fusion等字眼而打擊初學者的信心,否則許多人會以為這是一本講冶金而不是程序設(shè)計的書。 本書的主要讀者是已經(jīng)有一定編程經(jīng)驗,并想多學一種語言來“傍身”的開發(fā)者。但我還是小心地編排了本書的內(nèi)容,使之對各種層次的開發(fā)者都有足夠大的價值。
初學者:假如你是編程新手,本書將幫助你從入門級程序員過渡為C#開發(fā)者,消除以后在面臨任何C#編程任務時的害怕心理。本書不僅要教會你語法,還要教你養(yǎng)成良好的編程習慣,為將來的編程生涯打下良好基礎(chǔ)。
熟悉結(jié)構(gòu)化編程的程序員:學習外語最好的方法就是“沉浸法”。類似地,學習一門計算機語言最好的方法就是在動手中學習,而不是等熟知了它的所有“理論”之后再動手。基于這個前提,本書最開始的內(nèi)容是那些熟悉結(jié)構(gòu)化編程的開發(fā)者很容易上手的。到第5章結(jié)束時,這些開發(fā)者應該可以開始寫基本的控制流程序。然而,要成為真正的C#開發(fā)者,記住語法只是第一步。為了從簡單程序過渡到企業(yè)級開發(fā),C#開發(fā)者必須熟練從對象及其關(guān)系的角度來思考問題。為此,第6章的“初學者主題”開始介紹類和面向?qū)ο箝_發(fā)。歷史上的C、COBOL和FORTRAN等結(jié)構(gòu)化編程語言雖然仍在發(fā)揮作用,但作用會越來越小,所以,軟件工程師們應該逐漸開始了解面向?qū)ο箝_發(fā)。C#是進行這一思維模式轉(zhuǎn)變的理想語言,因為它本來就是基于“面向?qū)ο箝_發(fā)”這一中心思想來設(shè)計的。
熟悉“基于對象”和“面向?qū)ο蟆崩砟畹拈_發(fā)者:C++、Python、TypeScript、Visual Basic和Java程序員都可歸于此類。對于分號和大括號,他們可是一點兒都不陌生!簡單瀏覽一下第1章的代碼,你會發(fā)現(xiàn),從核心上講,C#類似于你熟知的C和C++風格的語言。
C#專家:對于已經(jīng)精通C#的讀者,本書可供你參考不太常見的語法。此外,對于在其他地方強調(diào)較少的一些語言細節(jié)以及微妙之處,我提出了自己的見解。最重要的是,本書提供了編寫可靠和易維護代碼的指導原則及模式。在你教別人學C#時,本書也頗有助益。從C# 3.0到C# 7.0最重要的一些增強包括:
字符串插值(第2章)
隱式類型的變量(第3章)
元組(第3章)
模式匹配(第4章)
擴展方法(第6章)
分部方法(第6章)
泛型(第12章)
Lambda語句和表達式(第13章)
表達式樹(第13章)
匿名類型(第15章)
標準查詢操作符(第15章)
查詢表達式(第16章)
動態(tài)編程(第18章)
用任務編程庫(TPL)和async進行多線程編程(第19章)
用PLINQ進行并行查詢處理(第19章)
并發(fā)集合(第20章)
考慮到許多人還不熟悉這些主題,本書圍繞它們展開了詳細的討論。涉及高級C#開發(fā)的還有“指針”這一主題,該主題將在第21章討論。即使是有經(jīng)驗的C#開發(fā)者,也未必能很透徹地理解這一主題。
本書特色
本書是語言參考書,遵循核心《C#語言7.0規(guī)范》(C# Language 7.0 Specification)。為了幫助讀者理解各種C#構(gòu)造,書中用大量例子演示了每一種特性,而且為每個概念都提供了相應的指導原則和最佳實踐,以確保代碼能順利編譯,避免留下隱患,并獲得最佳的可維護性。
為增強可讀性,所有代碼均進行了特殊格式處理,而且每章內(nèi)容都用思維導圖來概括。
C#設(shè)計規(guī)范
本書新版本最重大的改進之一就是增加了大量“設(shè)計規(guī)范”,下面是取自第17章的例子。
設(shè)計規(guī)范
要確保相等的對象有相等的散列碼。
要確保對象在散列表中時散列碼永不變化。
要確保散列算法快速生成良好分布的散列碼。
要確保散列算法在任何可能的對象狀態(tài)中的健壯性。
區(qū)分知道語法的程序員和能因地制宜寫出最高效代碼的專家的關(guān)鍵就是這些設(shè)計規(guī)范。專家不僅能讓代碼通過編譯,還會遵循最佳實踐,降低出現(xiàn)bug的概率,并使代碼的維護變得更容易。設(shè)計規(guī)范強調(diào)了一些關(guān)鍵原則,開發(fā)時務必注意。
示例代碼
本書大多數(shù)代碼都能在公共語言基礎(chǔ)結(jié)構(gòu)(Common Language Infrastructure,CLI)的任何實現(xiàn)上運行,但重點還是Microsoft .NET Framework和.NET Core這兩個實現(xiàn)。很少使用平臺或廠商特有的庫,除非需要解釋只和那些平臺相關(guān)的重要概念(例如,解釋如何正確處理Windows單線程UI)。
下面是一個示例代碼清單。
代碼清單1-19 注釋代碼
下面解釋具體的格式:
注釋使用斜體。
關(guān)鍵字加粗。
有的代碼突出顯示,是為了指出這些代碼與之前的有區(qū)別,或是為了演示正文介紹的概念。
突出顯示的可能是一整行,也可能是一行中的幾個字符。
省略號表示無關(guān)代碼已省略。
代碼清單后列出了對應的控制臺輸出。由用戶輸入的內(nèi)容加粗。
輸出1-7
雖然我也可以在書中提供完整代碼以方便復制,但這樣會分散大家的注意力。因此,你需要在自己的程序中修改示例代碼。書中的代碼主要省略了錯誤檢查,比如異常處理。另外,代碼沒有顯式包含using System語句,所有例子都需要該語句。
請訪問https://github.com/IntelliTect/EssentialCSharp或http://bookzhou.com下載示例代碼。
思維導圖
每章開頭都有一幅“思維導圖”作為提綱,目的是為讀者提供針對每章內(nèi)容的快速參考。下面是一個例子(摘自第6章)。
每章主題顯示在思維導圖的中心,高級主題圍繞中心展開。利用思維導圖,讀者可方便地搭建自己的知識體系,可以從一個主題出發(fā),更清楚地理解其周邊的各個具體概念,避免中途糾纏于一些不相干的枝節(jié)問題。
分類解說
根據(jù)編程水平的不同,可以利用書中的標志來幫助自己輕松找到適合自己的內(nèi)容。
初學者主題:特別針對入門級程序員提供的定義或解釋。
高級主題:可以讓有經(jīng)驗的開發(fā)者將注意力放在他們最關(guān)心的內(nèi)容上。
標注:用有底紋的標注框強調(diào)關(guān)鍵點,引起讀者的注意。
語言對比:分散在正文中的補充內(nèi)容描述了C#和其他語言的關(guān)鍵差異,為熟悉其他語言的讀者提供指引。
本書內(nèi)容組織
總體來說,軟件工程的宗旨就是管理復雜性。本書基于該宗旨來組織內(nèi)容。第1章~第5章介紹結(jié)構(gòu)化編程,學習這些內(nèi)容后,可以立即開始寫一些功能簡單的代碼。第6章~第10章介紹C#的面向?qū)ο髽?gòu)造,新手應在完全理解這幾章的內(nèi)容之后,再開始接觸本書其余部分更高級的主題。第12章~第14章介紹更多用于降低復雜性的構(gòu)造,講解當今幾乎所有程序都要用到的通用設(shè)計模式。理解了它們之后,才可以更輕松地理解如何通過反射和特性來進行動態(tài)編程。后續(xù)章節(jié)將廣泛運用它們來實現(xiàn)線程處理和互操作性。
本書最后專門用一章(第22章)講解CLI。這一章在開發(fā)平臺的背景下對C#語言進行了描述。之所以要放到最后,是因為它非C#特有,且不涉及語法和編程風格問題。不過,本章適合在任何時候閱讀,或許最恰當?shù)臅r機是在閱讀完第1章之后。
下面是每一章的內(nèi)容提要。(加黑的標題表明那一章含有C# 6.0和C# 7.0的內(nèi)容。)
第1章—C#概述:本章在展示了用C#寫的HelloWorld程序之后對其進行細致分析。目的是讓讀者熟悉C#程序的“外觀和感覺”,并理解如何編譯和調(diào)試自己的程序。另外,還簡單描述了執(zhí)行C#程序的上下文及其中間語言(intermediate language,IL)。
第2章—數(shù)據(jù)類型:任何有用的程序都要處理數(shù)據(jù),本章介紹了C#的基元數(shù)據(jù)類型。
第3章—更多數(shù)據(jù)類型:本章深入講解數(shù)據(jù)類型的兩大類別:值類型和引用類型。然后講解了可空修飾符以及C# 7.0引入的元組。最后深入討論了基元數(shù)組結(jié)構(gòu)。
第4章—操作符和控制流:計算機最擅長重復性操作,為利用該能力,需知道如何在程序中添加循環(huán)和條件邏輯。本章還討論了C#操作符、數(shù)據(jù)轉(zhuǎn)換和預處理器指令。
第5章—方法和參數(shù):本章討論了方法及其參數(shù)的細節(jié),其中包括通過參數(shù)來傳值、傳引用和通過out參數(shù)返回數(shù)據(jù)。C# 4.0新增了默認參數(shù),本章將解釋如何使用。
第6章—類:前面已學過類的基本構(gòu)成元素,本章合并這些構(gòu)造,以獲得具有完整功能的類型。類是面向?qū)ο蠹夹g(shù)的核心,它定義了對象模板。
第7章—繼承:繼承是許多開發(fā)者的基本編程手段,C#更是提供了一些獨特構(gòu)造,比如new修飾符。本章討論了繼承語法的細節(jié),其中包括重寫(overriding)。
第8章—接口:本章討論如何利用接口來定義類之間的“可進行版本控制的交互契約”(versionable interaction contract)。C#同時包含顯式和隱式接口成員實現(xiàn),可實現(xiàn)一個額外的封裝等級,這是其他大多數(shù)語言所不支持的。
第9章—值類型:盡管不如定義引用類型那么頻繁,但有時確有必要定義行為和C#內(nèi)置基元類型相似的值類型。本章介紹如何定義結(jié)構(gòu)(struct),同時也強調(diào)其特殊性。
第10章—合式類型:本章討論了更高級的類型定義,解釋如何實現(xiàn)操作符,比如+和轉(zhuǎn)型操作符,并描述如何將多個類封裝到一個庫中。此外,還演示了如何定義命名空間和XML注釋,并討論如何基于垃圾回收機制來設(shè)計令人滿意的類。
第11章—異常處理:本章延伸討論第5章引入的異常處理機制,描述了如何利用異常層次結(jié)構(gòu)創(chuàng)建自定義異常。此外,還強調(diào)了異常處理的一些最佳實踐。
第12章—泛型:泛型或許是C# 1.0最缺少的功能。本章全面討論自2.0引入的泛型機制。此外,C# 4.0增加了對協(xié)變和逆變的支持,本章將在泛型背景中探討它們。
第13章—委托和Lambda表達式:正因為委托,才使C#與其前身語言(C和C++等)有了顯著不同,它定義了在代碼中處理事件的模式。這幾乎完全消除了寫輪詢例程的必要。Lambda表達式是使C# 3.0的LINQ成為可能的關(guān)鍵概念。通過學習本章,你將知道Lambda表達式是在委托的基礎(chǔ)上構(gòu)建起來的,它提供了比委托更優(yōu)雅和簡潔的語法。本章內(nèi)容是第14章討論的新的集合API的基礎(chǔ)。本章還強調(diào)了匿名方法應該用新的Lambda表達式代替。
第14章—事件:封裝起來的委托(稱為事件)是公共語言運行時(Common Language Runtime,CLR)的核心構(gòu)造。
第15章—支持標準查詢操作符的集合接口:通過討論新的Enumerable類的擴展方法,介紹C# 3.0引入的一些簡單而強大的改變。Enumerable類造就了全新的集合API,即“標準查詢操作符”,本章對其進行詳細討論。
第16章—使用查詢表達式的LINQ:如果只使用標準查詢操作符,會形成讓人難以辨認的長語句。查詢表達式提供了一種類似SQL風格的語法,有效解決了該問題。本章會詳細討論這種表達式。
第17章—構(gòu)建自定義集合:構(gòu)建用于操縱業(yè)務對象的自定義API時,經(jīng)常需要創(chuàng)建自定義集合。本章討論了具體做法,還介紹了能使自定義集合的構(gòu)建變得更簡單的上下文關(guān)鍵字。
第18章—反射、特性和動態(tài)編程:20世紀80年代末,程序結(jié)構(gòu)的思維模式發(fā)生了根本性的變化,面向?qū)ο蟮木幊淌沁@個變化的基礎(chǔ)。類似地,特性(attribute)使聲明性編程和嵌入元數(shù)據(jù)成為可能,因而引入了一種新的思維模式。本章探討了特性的方方面面,并討論了如何通過反射機制來獲取它們。本章還討論了如何通過基類庫(Base Class Library,BCL)中的序列化框架來實現(xiàn)文件的輸入輸出。C# 4.0新增了dynamic關(guān)鍵字,能將所有類型檢查都移至運行時進行,因而極大地擴展了C#的能力。
第19章—多線程處理:大多數(shù)現(xiàn)代程序都要求用線程執(zhí)行長時間運行的任務,同時確保對并發(fā)事件的快速響應。隨著程序越來越復雜,必須采取其他措施來保護這些高級環(huán)境中的數(shù)據(jù)。多線程應用程序的編寫比較復雜。本章討論了如何操縱線程,并提供一些最佳實踐來避免將多線程應用程序弄得一團糟。
第20章—線程同步:本章以第19章為基礎(chǔ),演示如何利用一些內(nèi)建線程處理模式來簡化對多線程代碼的顯式控制。
第21章—平臺互操作性和不安全的代碼:必須意識到C#是相對年輕的一種語言,許多現(xiàn)有的代碼是用其他語言寫成的。為了用好這些現(xiàn)有代碼,C#通過P/Invoke提供了對互操作性(調(diào)用非托管代碼)的支持。此外,C#允許使用指針,也允許執(zhí)行直接內(nèi)存操作。雖然使用了指針的代碼要求特殊權(quán)限才能運行,但它具有與C風格的API完全兼容的能力。
第22章—公共語言基礎(chǔ)結(jié)構(gòu)(CLI):事實上,C#被設(shè)計成一種在CLI頂部工作的最有效的編程語言。本章討論了C#程序與底層“運行時”及其規(guī)范的關(guān)系。
—Mark Michaelis
IntelliTect.com/mark
Twitter: @Intellitect, @MarkMichaelis
致 謝
為保證本書技術(shù)上的準確性,許多技術(shù)編輯對本書中的各章都進行了仔細審閱。我常常驚訝于他們的認真程度,任何不易察覺的小錯誤都逃不過他們的火眼金睛,他們是Paul Bramsman、Kody Brown、Ian Davis、Doug Dechow、Gerard Frantz、Thomas Heavey、Anson Horton、Brian Jones、Shane Kercheval、Angelika Langer、Eric Lippert、John Michaelis、Jason Morse、Nicholas Paldino、Jon Skeet、Michael Stokesbary、Robert Stokesbary、John Timney、Neal Lundby、Andrew Comb、Jason Peterson、Andrew Scott、Dan Haley、Phil Spokas(第22章有一部分是他寫的)和Kevin Bost。
就像Eric之于C# ,很少有人像Stephen Toub那樣對.NET Framework多線程處理有如此深刻的理解。Stephen專門審閱了(第三次了)重寫的關(guān)于多線程的兩章,并重點檢查了C# 5.0中的async支持。謝謝你,Stephen!
感謝Addison-Wesley的所有員工,感謝他們在與我合作期間表現(xiàn)出來的極大耐心,容忍我將注意力頻頻轉(zhuǎn)移到書稿之外的其他事情上。感謝Trina Fletcher Macdonald、Anna Popick、Julie Nahil和Carol Lallier。Trina值得頒發(fā)勞模獎章,在她明顯還有其他好多事情的時候,還能容忍我這樣的人。Carol則非常嚴謹,她改進寫作和挑錯的本事令人稱道(甚至能從代碼清單中挑出文法錯誤)。
Mark Michaelis是高端軟件工程和咨詢公司IntelliTect的創(chuàng)辦者、首席技術(shù)架構(gòu)師和培訓師。Mark經(jīng)常在開發(fā)者大會上發(fā)言,寫過許多文章和書籍,目前是《MSDN Magazine》的《Essential .NET》專欄作家。
從1996年起,他一直是C#、Visual Studio Team System和Windows SDK的MVP。2007年被評選為微軟的Regional Director。他還服務于微軟的幾個軟件設(shè)計評審團隊,包括C#和VSTS。
Mark擁有伊利諾伊大學哲學專業(yè)文學學士學位和伊利諾伊理工大學計算機碩士學位。
他不是癡迷于計算機,就是忙于陪伴家人或者玩壁球(2016年暫停鐵人三項訓練)。他居住在華盛頓州的斯波坎,他和妻子Elisabeth有三個孩子:Benjamin、Hanna和Abigail。
技術(shù)編輯簡介
Eric Lippert目前在Facebook負責開發(fā)者工具。之前是微軟C#語言設(shè)計團隊的一員。不在StackOverflow上回答用戶的C#問題或者編輯程序書時,他總是喜歡玩他的小帆船。目前和妻子Leah居住在華盛頓州的西雅圖。
目 錄
第1章 C#概述???? 1
1.1 Hello, World??? 2
1.2 C#語法基礎(chǔ)??? 11
1.3 使用變量? 20
1.4 控制臺輸入和輸出?????? 24
1.5 注釋?? 28
1.6 托管執(zhí)行和CLI????? 32
1.7 多個.NET框架 37
第2章 數(shù)據(jù)類型? 43
2.1 基本數(shù)值類型 44
2.2 更多基本類型 53
2.3 null和void???? 67
2.4 數(shù)據(jù)類型轉(zhuǎn)換 69
第3章 更多數(shù)據(jù)類型 77
3.1 類型的劃分???? 77
3.2 可空修飾符???? 80
3.3 元組?? 83
3.4 數(shù)組?? 90
第4章 操作符和控制流程?????? 109
4.1 操作符????? 110
4.2 控制流程概述 126
4.3 代碼塊????? 132
4.4 代碼塊、作用域和聲明空間???? 135
4.5 布爾表達式???? 137
4.6 按位操作符???? 147
4.7 控制流程語句(續(xù))?? 153
4.8 跳轉(zhuǎn)語句? 165
4.9 C#預處理器指令?? 171
第5章 方法和參數(shù)???? 181
5.1 調(diào)用方法? 182
5.2 聲明方法? 189
5.3 using指令?????? 195
5.4 Main()的返回值和參數(shù) 200
5.5 高級方法參數(shù) 203
5.6 遞歸?? 215
5.7 方法重載? 217
5.8 可選參數(shù)? 220
5.9 用異常實現(xiàn)基本錯誤處理? 225
第6章 類?????? 241
6.1 類的聲明和實例化?????? 245
6.2 實例字段? 249
6.3 實例方法? 251
6.4 使用this關(guān)鍵字??? 252
6.5 訪問修飾符???? 259
6.6 屬性?? 261
6.7 構(gòu)造函數(shù)? 278
6.8 靜態(tài)成員? 289
6.9 擴展方法? 299
6.10 封裝數(shù)據(jù)?????? 301
6.11 嵌套類??? 304
6.12 分部類??? 307
第7章 繼承?? 313
7.1 派生?? 314
7.2 重寫基類? 326
7.3 抽象類????? 338
7.4 所有類都從System.Object派生???? 344
7.5 使用is操作符驗證基礎(chǔ)類型??? 345
7.6 使用is操作符進行模式匹配??? 346
7.7 switch語句中的模式匹配? 347
7.8 使用as操作符進行轉(zhuǎn)換??? 349
第8章 接口?? 353
8.1 接口概述? 354
8.2 通過接口實現(xiàn)多態(tài)性?? 355
8.3 接口實現(xiàn)? 360
8.4 在實現(xiàn)類和接口之間轉(zhuǎn)換? 366
8.5 接口繼承? 366
8.6 多接口繼承???? 369
8.7 接口上的擴展方法?????? 369
8.8 通過接口實現(xiàn)多繼承?? 371
8.9 版本控制? 374
8.10 比較接口和類????? 375
8.11 比較接口和特性? 377
第9章 值類型????? 379
9.1 結(jié)構(gòu)?? 383
9.2 裝箱?? 390
9.3 枚舉?? 398
第10章 合式類型?????? 411
10.1 重寫object的成員??? 411
10.2 操作符重載?? 424
10.3 引用其他程序集? 432
10.4 定義命名空間????? 442
10.5 XML注釋????? 445
10.6 垃圾回收?????? 449
10.7 資源清理?????? 452
10.8 推遲初始化?? 461
第11章 異常處理?????? 465
11.1 多異常類型?? 465
11.2 捕捉異常?????? 469
11.3 常規(guī)catch塊?????? 473
11.4 異常處理規(guī)范????? 475
11.5 自定義異常?? 479
11.6 重新拋出包裝的異常 483
第12章 泛型 487
12.1 如果C#沒有泛型?????? 488
12.2 泛型類型概述????? 493
12.3 約束 506
12.4 泛型方法?????? 519
12.5 協(xié)變性和逆變性? 524
12.6 泛型的內(nèi)部機制? 531
第13章 委托和Lambda表達式??? 537
13.1 委托概述?????? 538
13.2 聲明委托類型????? 542
13.3 Lambda表達式?? 550
13.4 匿名方法?????? 556
第14章 事件 575
14.1 使用多播委托編碼Publish-Subscribe模式????? 576
14.2 理解事件?????? 591
第15章 支持標準查詢操作符的集合接口? 603
15.1 集合初始化器????? 604
15.2 IEnumerable
15.3 標準查詢操作符? 613
15.4 匿名類型之于LINQ?? 646
第16章 使用查詢表達式的LINQ? 657
16.1 查詢表達式概述? 658
16.2 查詢表達式只是方法調(diào)用?????? 676
第17章 構(gòu)建自定義集合? 679
17.1 更多集合接口????? 680
17.2 主要集合類?? 683
17.3 提供索引器?? 702
17.4 返回null或者空集合 705
17.5 迭代器??? 705
第18章 反射、特性和動態(tài)編程??? 721
18.1 反射 722
18.2 特性 735
18.3 使用動態(tài)對象進行編程??? 759
第19章 多線程處理?? 771
19.1 多線程處理基礎(chǔ)? 774
19.2 使用System.Threading??? 781
19.3 異步任務?????? 789
19.4 取消任務?????? 810
19.5 基于任務的異步模式 816
19.6 并行迭代?????? 846
19.7 并行執(zhí)行LINQ查詢? 856
第20章 線程同步?????? 863
20.1 線程同步的意義? 864
20.2 計時器??? 893
第21章 平臺互操作性和不安全代碼?? 897
21.1 平臺調(diào)用?????? 898
21.2 指針和地址?? 910
21.3 通過委托執(zhí)行不安全代碼?????? 920
第22章 公共語言基礎(chǔ)結(jié)構(gòu)(CLI)??? 923
22.1 CLI的定義???? 924
22.2 CLI的實現(xiàn)???? 925
22.3 .NET標準????? 928
22.4 BCL? 929
22.5 C#編譯成機器碼 929
22.6 運行時??? 932
22.7 程序集、清單和模塊 936
22.8 公共中間語言????? 939
22.9 公共類型系統(tǒng)????? 939
22.10 公共語言規(guī)范??? 940
22.11 元數(shù)據(jù)? 941
22.12 NET Native和AOT編譯?????? 942
Contents
1 Introducing C# 1
Hello, World 2
C# Syntax Fundamentals 11
Working with Variables 20
Console Input and Output 24
Commne ts? 28
Managed Execution and the Common Language Infrastructure 32
Multiple .NET Frameworks 37
2 Data Types 43Fundamental Numeric Types 44
More Fundamental Types 53
null and void 67
Conversions between Data Types 69
3 More with Data Types 77
Categories of Types 77
Nullable Modifier 80
Tuples 83
Arrays 90
4 Operators and Control Flow 109
Operators 110
Introducing Flow Control 126
Code Blocks ({}) 132
Code Blocks, Scopes, and Declaration Spaces 135
Boolean Expressions 137
Bitwise Operators (<<, >>, |, &, ^, ~) 147
Control Flow Statements, Continued 153
Jump Statements 165
C# Preprocessor Directives 171
5 Methods and Parameters 181
Calling a Method 182
Declaring a Method 189
The using Directive 195
Returns and Parameters on Main() 200
Advanced Method Parameters 203
Recursion 215
Method Overloading 217
Optional Parameters 220
Basic Error Handling with Exceptions 225
6 Classes 241
Declaring and Instantiating a Class 245
Instance Fields 249
Instance Methods 251
Using the this Keyword 252
Access Modifiers 259
Properties 261
Constructors 278
Static Members 289
Extension Methods 299
Encapsulating the Data 301
Nested Classes 304
Partial Classes 307
7 Inheritance 313
Derivation 314
Overriding the Base Class 326
Abstract Classes 338
All Classes Derive from System.Object 344
Verifying the Underlying Type with the is Operator 345
Pattern Matching with the is Operator 346
Pattern Matching within a switch Statement 347
Conversion Using the as Operator 349
8 Interfaces 353
Introducing Interfaces 354
Polymorphism through Interfaces 355
Interface Implementation 360
Converting between the Implementing Class and Its Interfaces 366
Interface Inheritance 366
Multiple Interface Inheritance 369
Extension Methods on Interfaces 369
Implementing Multiple Inheritance via Interfaces 371
Versioning 374
Interfaces Compared with Classes 375
Interfaces Compared with Attributes 377
9 Value Types 379
Structs 383
Boxing 390
Enums 398
10 Well-Formed Types 411
Overriding object Members 411
Operator Overloading 424
Referencing Other Assemblies 432
Defining Namespaces 442
XML Comments 445
Garbage Collection 449
Resource Cleanup 452
Lazy Initialization 461
11 Exception Handling 465
Multiple Exception Types 465
Catching Exceptions 469
General Catch Block 473
Guidelines for Exception Handling 475
Defining Custom Exceptions 479
Rethrowing a Wrapped Exception 483
12 Generics 487
C# without Generics 488
Introducing Generic Types 493
Constraints 506
Generic Methods 519
Covariance and Contravariance 524
Generic Internals 531
13 Delegates and Lambda Expressions 537
Introducing Delegates 538
Declaring Delegate Types 542
Lambda Expressions 550
Anonymous Methods 556
14 Events 575
Coding the Publish-Subscribe Pattern with Multicast Delegates 576
Understanding Events 591
15 Collection Interfaces with Standard Query Operators 603
Collection Initializers 604
What Makes a Class a Collection: IEnumerable
Standard Query Operators 613
Anonymous Types with LINQ 646
16 LINQ with Query Expressions 657
Introducing Query Expressions 658
Query Expressions Are Just Method Invocations 676
17 Building Custom Collections 679
More Collection Interfaces 680
Primary Collection Classes 683
Providing an Indexer 702
Returning Null or an Empty Collection 705
Iterators 705
18 Reflection, Attributes, and Dynamic Programming 721
Reflection 722
Attributes 735
Programming with Dynamic Objects 759
19 Multithreading 771
Multithreading Basics 774
Working with System.Threading 781
Asynchronous Tasks 789
Canceling a Task 810
The Task-based Asynchronous Pattern 816
Executing Loop Iterations in Parallel 846
Running LINQ Queries in Parallel 856
20 Thread Synchronization 863
Why Synchronization? 864
Timers 893
21 Platform Interoperability and Unsafe Code 897
Platform Invoke 898
Pointers and Addresses 910
Executing Unsafe Code via a Delegate 920
22 The Common Language Infrastructure 923
Defining the Common Language Infrastructure 924
CLI Implementations 925
.NET Standard 928
Base Class Library 929
C# Compilation to Machine Code 929
Runtime 932
Assemblies, Manifests, and Modules 936
Common Intermediate Language 939
Common Type System 939
Common Language Specification 940
Metadata 941
.NET Native and Ahead of Time Compilation 942
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。