《C# 7.0本質(zhì)論(英文版)》(《出師表》)

      網(wǎng)友投稿 769 2025-04-01

      經(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ū)別,或是為了演示正文介紹的概念。

      突出顯示的可能是一整行,也可能是一行中的幾個字符。

      《C# 7.0本質(zhì)論(英文版)》(《出師表》)

      省略號表示無關(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使類成為集合???? 607

      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 607

      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)容。

      上一篇:excel中畫圖教程
      下一篇:OFFSET函數(shù)使用示例:動態(tài)區(qū)域中查找指定數(shù)據(jù)
      相關(guān)文章
      亚洲免费视频一区二区三区| 久久人午夜亚洲精品无码区| 亚洲av午夜精品无码专区| 亚洲午夜久久久久妓女影院| 亚洲AV成人精品日韩一区18p| 亚洲日本va一区二区三区| 亚洲综合精品伊人久久| 亚洲同性男gay网站在线观看| 亚洲国产日产无码精品| 亚洲中文无码线在线观看| 亚洲春色在线观看| 亚洲高清在线mv| 亚洲综合小说久久另类区| 亚洲宅男天堂a在线| 亚洲AV成人噜噜无码网站| 亚洲 暴爽 AV人人爽日日碰| 亚洲午夜无码久久| 亚洲国产成人手机在线观看| 精品亚洲福利一区二区| 亚洲国产高清精品线久久| 亚洲天堂免费在线视频| 亚洲女同成av人片在线观看| 亚洲AV中文无码乱人伦下载| 亚洲日本精品一区二区| 亚洲精品日韩专区silk| 亚洲av午夜精品无码专区| 亚洲国产成人AV在线播放 | 亚洲av无码成人精品区| 日韩精品电影一区亚洲| 国产成人亚洲综合无码| 久久亚洲国产中v天仙www| 亚洲影院在线观看| 色婷五月综激情亚洲综合| 亚洲男人的天堂网站| 亚洲精品成人片在线观看| 亚洲精品无码永久中文字幕| 亚洲一区影音先锋色资源| 2017亚洲男人天堂一| 免费亚洲视频在线观看| 亚洲中文字幕无码久久2017| 亚洲一卡2卡三卡4卡有限公司|