【正文】
the same directory as your assembly. If you want to share your code among many applications, you might want to consider deploying your code as a global assembly. Global assemblies can be used by any .NET application on the system, regardless of the directory in which it is installed. Microsoft ships assemblies as a part of the .NET Framework, and each of the Microsoft assemblies is installed as a global assembly. The .NET Framework contains a list of global assemblies in a facility called the global assembly cache, and the .NET Microsoft Framework SDK includes utilities to both install and remove assemblies from the global assembly cache. Summary In this chapter, you learned the basics of the .NET Framework. After tracing the evolution from C to C++ to C, you examined the high points of the C feature list. You also investigated the output of the C piler, MSIL code, and metadata, and reviewed the use of assemblies as the building blocks of piled .NET code. 環(huán)境 英特網(wǎng)起初是預(yù)想的傳遞靜態(tài)的內(nèi)容給網(wǎng)頁瀏覽器。這些網(wǎng)頁從來不會(huì)改變,一些使用者在本地瀏覽它們?;钴S的服務(wù)頁面被微軟授權(quán)使之能夠創(chuàng)建一個(gè)基于用戶的輸入和互通的,使用同一個(gè)網(wǎng)址的動(dòng)態(tài)的頁面。這些通常通過處于網(wǎng)頁后面的腳本所完成,典型的是VB 腳本。當(dāng)用戶訪問一個(gè)頁面時(shí),它們將被提示出一個(gè)核實(shí)信息(或者是手動(dòng),或者是通過一個(gè)小程序),之后這個(gè)腳本將會(huì)產(chǎn)生一個(gè)相應(yīng)的網(wǎng)址反饋給用戶。 發(fā)展在被提供代碼隱藏的原始 ASP 上。在 ASP 中, HTML和腳本被混合在一個(gè)文件中。通過使用 和代碼隱藏,代碼和 HTML能夠被分開?,F(xiàn)在,當(dāng)一個(gè)邏輯的網(wǎng)址需要被更改的時(shí)候,從成千上萬行的 HTML 中篩選已經(jīng)不是必須的了,只有腳本需要被改變。 類似于許多窗口形式, 提供了一些網(wǎng)頁形式。網(wǎng)頁形式使你能夠拖拉和下放一些操作在你的表格中,而且對(duì)于你的代碼隱藏將會(huì)在典型的窗口應(yīng)用中。 因?yàn)? 使用 .NET 結(jié)構(gòu),它同樣使用運(yùn)行時(shí)編譯技術(shù)的編譯器。傳統(tǒng)的 ASP 頁面運(yùn)行很慢因?yàn)榇a被編譯了。 編譯代碼當(dāng)它被安裝進(jìn)服務(wù)器或者第一次被請(qǐng)求的時(shí)候,這大大提高了速度。 C,C++,C的歷史 C程序語言是建立在 C 和 C++程序語言的精神上的。這個(gè)賬目有著很有力的特征和易學(xué)的曲線。不能說 C與 C 和 C++相同,但是因?yàn)?C是建立在這兩者之上,微軟移除了一些成為更多負(fù)擔(dān)的特征,比如說指針。這部分觀看 C 和 C++,在 C中追蹤它們的發(fā)展。 C 程序語言原本是被定義在 UNIX操作系統(tǒng)中的。 C 過去經(jīng)常編寫一些 UNIX的應(yīng)用程序,包括一個(gè) C 編譯器,最后被用于寫 UNIX 自己。它普遍認(rèn)可在這個(gè)學(xué)術(shù)上的競(jìng)爭擴(kuò)展到包含這個(gè)商業(yè)的世界,并且像微軟和 Borland 這樣的軟件供應(yīng)商發(fā)放了 C 編譯器在個(gè)人電腦上。 最初的 Windows API 被定義與使用 C 同 Windows 代碼一起工作,并且直到今天至少設(shè)置核心的 Windows 操作系統(tǒng) APIS 保持 C 編譯器。 來自一個(gè)定義的觀點(diǎn), C 缺乏一個(gè)細(xì)節(jié)就像 Smalltalk 這類語言也包含的一樣,一個(gè)對(duì)象的概念。你將會(huì)學(xué)到更多的關(guān)于對(duì)象的內(nèi)容在第八章“寫面向?qū)ο蟮拇a”,目前,思考一個(gè)對(duì)象作為一個(gè)數(shù)據(jù)的收集并且設(shè)置了一些操作,使我們能夠執(zhí)行這些數(shù)據(jù)。對(duì)象類型的代碼可以被 C 來完成,但是對(duì)象的觀念并不能被強(qiáng)制出現(xiàn)在這個(gè)語言中。如果你想要構(gòu)造你的代碼使之像一個(gè)對(duì)象,很好。如果你不想這么 做, C 也確實(shí)不會(huì)介意。對(duì)象并不是一個(gè)固有的部分在這門語言中,很多人并沒有花很大的經(jīng)歷在這個(gè)程序示例中。 當(dāng)面向?qū)ο蟮挠^點(diǎn)的發(fā)展開始得到認(rèn)可之后,很明顯, C 需要被精簡去包含這種全新的思考代碼的方法。 C++被開發(fā)出,包含了這種改良。它被定義去兼容 C(就像所有的 C程序同樣也是 C++程序,并且可以被 C++編譯器編譯)。 C++語言主要的增加是提供這種新的概念。 C++又額外提供了的類(對(duì)象的模板),并且激活了全部的 C 程序關(guān)于對(duì)象方面和它的行為的衍生。 C++語言是 C 語言之上的改良體,但是它仍有一些缺陷。 C 和 C++很 難獲得一個(gè)處理在不熟悉的不常用的語言上,例如 VB, C和 C++是很底層的,而且需要你錯(cuò)大量的編碼來使你的應(yīng)用程序很好的運(yùn)行。你不得不寫一些自己的代碼區(qū)處理一些問題,就像存儲(chǔ)器的而管理和錯(cuò)誤檢查。 C 和 C++可以處理在一些非常給力的應(yīng)用程序中,但是你不得不保證你的代碼工作的很流暢。一個(gè)漏洞可以使得整個(gè)應(yīng)用程序死機(jī)或者發(fā)生出乎意料的行為。因?yàn)?C++被設(shè)定的目標(biāo)是保持對(duì) C 的兼容, C++不能夠打破 C 的底層特性。 微軟定義的 C保留了很多 C 和 C++的語句。對(duì)那些語言熟悉的開發(fā)者可以找出 C的代碼并且能想對(duì)快地識(shí)別代碼。 對(duì)于 C來說一個(gè)很大的優(yōu)勢(shì)是它的設(shè)計(jì)師并沒有讓它去兼容C 和 C++。當(dāng)這看起來或許是個(gè)錯(cuò)誤的處理時(shí),事實(shí)上是一個(gè)好消息。 C剔除了一些使得 C和 C++工作起來很困難的東西。因?yàn)樗械?C 代碼也是 C++代碼。 C++不得不保持所有的原始怪癖和在 C 中發(fā)現(xiàn)的缺陷。 C正在開始一個(gè)清潔的石板并且沒有任何兼容需求。因此它能夠保持前輩的強(qiáng)項(xiàng)并且丟棄使得 C 和 C++程序生存困難的弱點(diǎn)。 引進(jìn) C C這門在 .NET 體系中被引進(jìn)的全新語言,是從 C++衍生出來的。然而, C是一門流行的,面向?qū)ο蟮模◤念^到尾)類型安全的語言。 語言特征 下面的部分提供了一個(gè)快速的視角關(guān)于 C語言的一些特征。如果它們中的某些概念對(duì)你來說很陌生,不要著急,所有的東西都將在后續(xù)章節(jié)中詳細(xì)說明。 類 在 C中,所有的代碼和數(shù)據(jù)都必須被附在一個(gè)類中。你不能在類外定義一個(gè)變量,同樣的你也不能寫任何不在類中的代碼。當(dāng)一個(gè)類的對(duì)象被創(chuàng)建并且運(yùn)行時(shí),類就被構(gòu)造了。當(dāng)類的對(duì)象被釋放時(shí),類也就被銷毀了。類提供了單繼承,所有的類最終從基類獲取的東西就是對(duì)象。隨著時(shí)間的推移, C提供了有版本的技術(shù)去幫助你的類的形成來保養(yǎng)代碼的兼容當(dāng)你使用你更早期的類的代碼的時(shí)候。 下面讓我們來看一個(gè)叫做 Family 的類的例子。這個(gè)類包含了兩個(gè)靜態(tài)的域來保存家庭成員的第一個(gè)名字和最后一個(gè)名字。同樣的,有一個(gè)方法來返回家庭成員的全名。 class Class1 { public string FirstName。 public string LastName。 public string FullName() { } return FirstName + LastName。 } 注:單繼承意味著一個(gè) C類只能從一個(gè)基類中繼承。 C是你能夠打包你的類放到一個(gè)被稱 作 namespace類的集合里面。 Namespaces有名字,并且可以在邏輯聚合上幫助安排類的收集。當(dāng)你開始學(xué)習(xí) C的時(shí)候,很明顯所有的namespace 都是和 .NET 類型的系統(tǒng)相關(guān)的。微軟同樣選擇包含了一些類輔助于兼容以前的代碼和 API 的通道。這些類同樣包含在微軟的 namespace 中。 數(shù)據(jù)類型 C讓你使用兩種類型的數(shù)據(jù)工作:值類型和引用類型。值類型保存實(shí)際的值。引用類型保存實(shí)際的值儲(chǔ)存在存儲(chǔ)器別處的位置。原始的數(shù)據(jù)類型,例如字符型,整型,浮點(diǎn)型,枚舉型還有結(jié)構(gòu)體類型,這些都是值類型。而對(duì)象和數(shù)組 類型被處理成了引用類型。 C預(yù)定義了引用類型(對(duì)象和字符串),同業(yè)也預(yù)定義了值類型(短字符,短整型,整型,長征新,字節(jié),無符號(hào)短整型,無符號(hào)整型,無符號(hào)長整型,浮點(diǎn)型,雙精度浮點(diǎn)型,布爾型,字符型和小數(shù)類型)。你同樣可以定義你自己的值類型和引用類型在你自己的代碼中。所有的值類型和引用類型最終都會(huì)被一個(gè)基本類型的對(duì)象執(zhí)行。 C同樣允許你將一個(gè)值或者一個(gè)類型轉(zhuǎn)變?yōu)榱硗庖粋€(gè)值或一種類型。你可以使用隱式的轉(zhuǎn)換策略或者顯式的轉(zhuǎn)換策略。隱式的轉(zhuǎn)換策略總是成功并且并不丟失任何信息(例如,你可以將一個(gè)整型轉(zhuǎn)換為一個(gè)長整 型而不用丟失任何信息因?yàn)殚L整型比整型長)。顯式的轉(zhuǎn)換策略可能會(huì)是你丟失一些數(shù)據(jù)(例如,講一個(gè)長整型轉(zhuǎn)換為一個(gè)整型或許會(huì)導(dǎo)致一些數(shù)據(jù)丟失因?yàn)殚L整型可以比整型保留更多的值)。你必須寫一個(gè)預(yù)測(cè)操作在你的代碼中來使顯式轉(zhuǎn)換發(fā)生。 前后引用 參考第三章“同變量一起工作”來找到更多的關(guān)于顯式和隱式轉(zhuǎn)換策略的信息。 你可以同時(shí)使用單維和多維的數(shù)組在 C中。多維數(shù)組能夠變成一個(gè)矩陣。當(dāng)這個(gè)矩陣與多維數(shù)組有相同的面積大小。或者參差不齊的,當(dāng)有些數(shù)組有不一樣的面積大小。 類和結(jié)構(gòu)體可以擁有數(shù)據(jù)成員被稱為屬性和字段。域是和封起 來的類或結(jié)構(gòu)體相關(guān)聯(lián)的變量。你可以定義一個(gè)叫做 Employee 的結(jié)構(gòu)體,例如,有一個(gè)被稱作 Name 的域,如果你定 義 了 一 個(gè) Employee 類 型 的 變 量 叫 做 CurrenrEmployee , 你 可 以 通 過 寫。屬性就像域,但是可以讓你寫代碼來闡述當(dāng)代碼賦值之后什么應(yīng)該發(fā)生。如果雇員的名字必須被一個(gè)數(shù)據(jù)庫讀,例如,你可以寫一個(gè)代碼“當(dāng)一些人詢問名字屬性的值時(shí),從數(shù)據(jù)庫中讀名字,并且返回這個(gè)名字用 string類型”。 函數(shù) 一個(gè)函數(shù)是一種可以隨時(shí)使用的代碼,當(dāng)原始 代碼調(diào)用它時(shí)可以返回也可以不返回值給代碼。一個(gè)函數(shù)的例子將會(huì)像 FullName 函數(shù)更早的展示的那樣,在這一章中,在 Family 類中。一個(gè)函數(shù)通常會(huì)聯(lián)合一些返回信息的代碼,而一個(gè)方法通常不返回信息。然而對(duì)于我們而言,我們一般都會(huì)把它們都?xì)w結(jié)于函數(shù)。 函數(shù)可以擁有四種參數(shù): ? 輸入的參數(shù)有值傳遞到函數(shù)內(nèi),但是函數(shù)無法改變它們的值。 ? 輸出的參數(shù)沒有值當(dāng)他們被傳遞給函數(shù)時(shí),但是函數(shù)可以給它們值并且將這個(gè)值傳回給它的調(diào)用者。 , ? 引用參數(shù)通過引用傳遞另外的一個(gè)值。它們有一個(gè)值進(jìn)入函數(shù), 并且這個(gè)值可以在函數(shù)中被更改。 ? 參數(shù)參數(shù)在列表中定義了一個(gè)數(shù)組變量。 C和 CLR一同工作來提供自動(dòng)的存儲(chǔ)管理。你不需要寫“為一個(gè)整數(shù)分配足夠的內(nèi)存”或者“留足夠的空間讓這個(gè)對(duì)象使用”這樣的代碼。 CLR 監(jiān)視你的內(nèi)存使用并且自動(dòng)的取回更逗當(dāng)你需要它的時(shí)候。他同樣自動(dòng)的清理內(nèi)存當(dāng)它發(fā)現(xiàn)它不再被需要使用時(shí)(這個(gè)以垃圾回收而著名)。 C提供了大量的運(yùn)算符使得你能夠?qū)懘罅康臄?shù)學(xué)和逐位運(yùn)算的表達(dá)式。他們當(dāng)中的大量(并不是所有)運(yùn)算符可以被重新定義,是你能夠改變這些運(yùn)算符的工作。 C提供了一個(gè)長的報(bào) 表的清單是你能夠定義各種各樣的處理路徑通過你的代碼。通過報(bào)表的操作,使用關(guān)鍵字,就像 switch,while,for,break 和 continue 能夠使你的代碼根據(jù)變量值的不同分入到不同的路徑中。 類能夠包含代碼和數(shù)據(jù)。每一個(gè)類成員都有一個(gè)被稱作可接近的范圍,它定義了這個(gè)成員對(duì)其他對(duì)象的可見性。 C提供了 public, protected, internal, protected internal 和 private這些可接近的范圍。 變量 變量可以被定義為常量。常量有固定的值并且在你的代碼執(zhí)行的過程中不能被改 變。這個(gè) PI 的值,例如,是一個(gè)很好的常量的例子,因?yàn)樗弥祵⒉粫?huì)被改變?cè)谀愕拇a運(yùn)行過程中。枚舉類型詳細(xì)的定義了一種有關(guān)常量的名稱。例如,你可以定義一個(gè)枚舉類型的行星使用值為 Mercury Venus earth Mars Jupiter Saturn Uranus Neptune Pluto,并且使用它們的名字在你的代碼中。如果你使用一個(gè)變量去表示行星的時(shí)候,用這個(gè)枚舉類型的 names 可以使你的代碼變的更易讀。 C提供了一個(gè)嵌入式的機(jī)制去定義和處理一些事件。如果你寫了一個(gè)類執(zhí)行了很漫長的操作,你或許想 調(diào)用一個(gè)事件當(dāng)這個(gè)運(yùn)算結(jié)束的時(shí)候??蛻艨梢院炇疬@個(gè)事件并且抓住這個(gè)事件在他們自己的代碼中,它可以讓他們被通知當(dāng)你已經(jīng)完成了你的漫長的運(yùn)算。這個(gè)事件處理機(jī)制在 C中使用了委托,一個(gè)引用函數(shù)的變量。 注:事件處理是一個(gè)在你代碼中的程序,當(dāng)一個(gè)事件發(fā)生時(shí)它決定了什么動(dòng)作將會(huì)發(fā)生。