回頭再學Asp.net系列--基礎篇(序)
2011-09-08 12:03 熬夜的蟲子 閱讀(572) 評論(0) 收藏 舉報時光如梭,不知不覺間蟲子作為碼農已經3年光景了。見識了太多了大牛、大俠。
站在巨人的肩膀上,容易好高騖遠。雖然自己確實做了很多,摸了不少,曾經還自詡為優秀的架構師。可真的站在架構師這個角度的時候突然發現自己的腳下是懸空的。危險!
蟲子相信和他類似的人很多很多,包括所謂的架構師。不信,我隨便問您2個問題,絕對是最基礎的,您或許了解但您未必全面:
1..NET BCL里有哪些是類(結構),為什么它們不是結構(類)?在自定義類型時,您如何選擇是類還是結構?
2.什么是.NET?什么是CLI?什么是CLR?IL是什么?JIT是什么,它??是如何工作的?GC是什么,簡述一下GC的工作方式?
從現在開始蟲子準備放下所有包袱重新回到地面上,從0開始,帶您回顧Asp.net的基礎之旅。當然,概念性的描述蟲子就不帶您回顧了,蟲子只是為了填坑。
先放出上面2個問題的答案吧。
1.類是一種“引用類型”。創建類的對象時,對象賦值到的變量只保存對該內存的引用。將對象引用賦給新變量時,新變量引用的是原始對象。通過一個變量做出的更改將反映在另一個變量中,因為兩者引用同一數據。
結構是一種值類型。創建結構時,結構賦值到的變量保存該結構的實際數據。將結構賦給新變量時,將復制該結構。因此,新變量和原始變量包含同一數據的兩個不同的副本。對一個副本的更改不影響另一個副本。
類通常用于對較為復雜的行為建模,或對要在創建類對象后進行修改的數據建模。結構最適合一些小型數據結構,這些數據結構包含的數據以創建結構后不修改的數據為主
堆棧的空間有限,對于大量的邏輯的對象,創建類要比創建結構好一些
結構表示如點、矩形和顏色這樣的輕量對象,例如,如果聲明一個含有1000 個點對象的數組,則將為引用每個對象分配附加的內存。在此情況下,結構的成本較低。
在表現抽象和多級別的對象層次時,類是最好的選擇
大多數情況下該類型只是一些數據時,結構時最佳的選擇
2.什么 是.NET
Dot Net是微軟在2000提出的一整套平臺,包括底層操作系統:Windows;輔助產品:Dot Net企業服務器;Mcirosoft XML Web服務:.Net My Services;開發平臺:Dot Net框架,集成的開發環境: Visual Studio 。以上幾個部分組成。
底層操作系統:當然是Windows 對全線的操作系統都提供XML Web服務支持。服務器操作系統2003開始,個人操作系統從Vista開始集成.Net Framework。并且操作系統原始的API也開始用Dot Net的API隔離,其原始構想相當龐大而激進,這在Vista的開發中顯得尤為明顯,后來微軟砍掉了一些原本的準備在Vista上發布的特性,但是Vista也已經表現的和前任大不相同,當然其中的是非曲折又是另一個話題了。總之為了Dot Net計劃微軟在操作系統上投入的心力,可以非常明確的看出微軟對Dot Net計劃的重視。
輔助產品:大家比較熟悉的就是SQL Server了吧,也有了脫胎換骨式 ??的變化,首先是那個集成了原來企業管理器,查詢分析器,跟蹤器的大一統管理工具
Microsoft XML Web服務:都是些微軟提供的XML Web服務,有些收費有些免費。(XML Web服務當年著實是一個“顯學”不過后來的發展并沒有如微軟預期的那樣成功 )
開發平臺(Dot Net框架):包含通用語言運行時(CLR)和Dot Net框架類庫(FCL)兩個部分。他們提供了一致的編程模型,簡化的編程方式,可靠的版本機制(用全局程序集緩存GAC來避免DLL Hell),輕便的部署管理(程序集自帶的元數據可以避免ini文件和注冊表) ,廣泛的平臺支持(只要這臺機器兼容標準下的CLR和FCL就可以部署,當然運行的時候IL會變成本機代碼),無縫的語言集成(JAVA跨平臺,Dot Net跨語言這是那個時候論戰經常看到的觀點 ),自動化的內存管理(垃圾收集),類型安全(CLR會阻止利用緩沖區溢出錯誤進行的攻擊),CLR支持跨語言調試,統一的錯誤報告(都用異常和原來返回的錯誤碼說再見吧),全新的安全策略(CAS),兼容以往的COM組件。
集成開發環境:Visual Studio 可以用來創建 Windows 平臺下的 Windows 應用程序和網絡應用程序,也可以用來創建網絡服務、智能設備應用程序和 Office 插件
什么是CLI?
通用語言基礎結構(Common Language Infrastructure,CLI)是CLR的一個子集,也就是.NET中最終對編譯成MSIL代碼的應用程序的運行環境進行管理的那一部分。在CLR結構圖中CLI位于下半部分,主要包括類加載器(Class Loader)、實時編譯器(IL To Native Compilers)和一個運行時環境的垃圾收集器(Garbage Collector)。CLI是.Net和CLR的靈魂,CLI為IL代碼提供運行的環境,你可以將使用任何語言編寫的代碼通過其特定的編譯器轉換為MSIL代碼之后運行其上,甚至還可以自己寫MSIL代碼在CLI上面運行。作為.Net與CLR的核心部分,CLI與C#也同時獲得了ECMA的批準(ECMA-335)。擁有了C#與CLI這兩項標準,你可以自己寫出能夠運行于任何操作系統上的.Net平臺(只要你愿意)。如前所述,著名的Mono項目就是這么干的,Mono項目包括三個核心的部分:一個C#語言的編譯器,一個CLI和一個類庫。
什么是CLR?
CLR(Common Language Runtime)公共語言運行時是一個可由多種編程語言使用的“運行時”。CLR的核心功能(比如內存管理、程序集加載、安全性、異常處理小、線程同步)可由CLR的所有語言共用。
IL是什么?
IL中間語言,Dot Net的程序經過編譯以后就形成了IL代碼,在運行的時候CLR將IL編譯成本地CPU指令。IL代碼也稱為托管代碼。IL可以訪問CLR的所有功能。IL也可視為一種面向對象的機器語言,可以使用匯編語言來編寫IL。IL優勢在于它會驗證代碼的正確性(參數數量,參數類型的驗證)
JIT是什么,它??是如何工作的?
JIT(Just In Time)即時編譯器,由CLR調用,將IL編譯成本地CPU指令。
當一段代碼第一次被調用的時候,CLR指向包含在CLR內部的一個特殊函數,這個特殊函數就是JITCompiler,JITCompiler負責將IL編譯成本地指令。JITCompiler知道實際調用的是哪個方法,以及該方法是那些類型定義的,JITCompiler會在定義該類型的程序集的元數據中查找被調用的方法的IL,并將IL編譯成本地的CPU指令。編譯的結果被放在一個內存塊中,然后JITCompiler返回CLR為類型創建的內部數據結構,找到被實際調用方法對應的那條記錄,修改最初對JITCompiler的引用,讓其指向內存塊中該被調用方法剛剛被編譯好的CPU指令的地址。最后執行被調用方法的CPU指令。
GC是什么,簡述一下GC的工作方式?
垃圾回收(garbage collection)
Dot Net的垃圾回收可以分為兩個步驟,第一步進行“標記”,垃圾回收器假設所有的對象都是垃圾,然后開始遍歷每一個“根”(根包含指向引用類型對象的一個指針,值類型對象永遠不會被認為是一個根),如果發現一個根引用了一個對象(非NULL),就對對象進行標記。沒有被標記的對象被認為是垃圾。第二個階段就是“壓縮”,其實就是將后面的對象移動到已經成為垃圾的對象位置,使得原來的托管堆更為緊湊。從而釋放了托管堆。
GC類中的方法影響何時對對象進行垃圾回收以及何時釋放對象所分配的資源。此類中的屬性提供以下信息:系統可用內存總量、分配給對象的內存的周期類別(代)。
GC跟蹤并回收托管內存中分配的對象。垃圾回收器定期執行垃圾回收以回收分配給沒有有效引用的對象的內存。當使用可用內存不能滿足內存請求時,垃圾回收會自動進行。或者,應用程序可以使用 Collect 方法強制進行垃圾回收。
垃圾回收由以下步驟組成:
GC搜索托管代碼中引用的托管對象。
GC嘗試完成沒有被引用的對象。
GC釋放沒有被引用的對象并回收它們的內存。
在回收期間,如果GC在托管代碼中找到對某對象的一個或多個引用,則不會釋放該對象。然而,GC不識別非托管代碼中對對象的引用,因此,除非明確禁止,否則它有可能釋放非托管代碼中以獨占方式使用的對象。KeepAlive 方法提供一種機制,該機制可防止垃圾回收器回收在非托管代碼中仍使用的對象。
![]() |
原創作品允許轉載,轉載時請務必以超鏈接形式標明文章原始出處以及作者信息。 作者:熬夜的蟲子 點擊查看:博文索引 |

浙公網安備 33010602011771號