




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、6個重要的.NET概念:棧,堆,值類型,引用類型,裝箱,拆箱引言本篇文章主要介紹.NET中6個重要的概念:棧,堆,值類型,引用類型,裝箱,拆箱。文章開始介紹當你聲明一個變量時,編譯器內(nèi)部發(fā)生了什么,然后介紹兩個重要的概念:棧和堆;最后介紹值類型和引用類型,并說明一些有關(guān)它們的重要原理。最后通過一個簡單的示例代碼說明裝箱拆箱帶來的性能損耗。 聲明變量的內(nèi)部機制在.NET程序中,當你聲明一個變量,將在內(nèi)存中分配一塊內(nèi)存。這塊內(nèi)存分為三部分:1,變量名;2,變量類型;3,變量值。下圖揭示了聲明一個變量時的內(nèi)部機制,其中分配的內(nèi)存類型依據(jù)你的變量類型。.NET中有兩種類型的內(nèi)存:棧Stack
2、內(nèi)存和堆Heap內(nèi)存。在接下來的內(nèi)容中,我們會了解到這兩種類型的詳細內(nèi)容。棧和堆為了明白什么是棧和堆,先讓我們看下下面示例代碼的內(nèi)部機制: ?12345678public void Method1() / Line 1 int i=4; / Line 2 int y=2; /Line 3 class1 cls1 = new class1(); 這里一共有3行代碼。讓我們一下逐行看一下它們是如何執(zhí)行的: 第1行:當這行代碼執(zhí)行時,編譯器為它分配一小塊棧內(nèi)存。運行時棧負責提供程序所需的內(nèi)存;第2行:程序繼續(xù)執(zhí)行。如同名字一樣,棧在第一塊內(nèi)存的頂部分配了一塊內(nèi)存。你也可以認為是模塊或零件一
3、塊一塊疊起來;內(nèi)存的分配與釋放遵循后進先出(后進先出)邏輯,換句話說,內(nèi)存只能在示例中i內(nèi)存塊的頂部分配或釋放。第3行:在第3行,我們創(chuàng)建了一個對象。當該行執(zhí)行時,編譯器在站上創(chuàng)建了一個指針,真實的對象存儲在另一種叫“堆”的內(nèi)存中。"堆"并不跟蹤運行內(nèi)存,它更像一堆隨時可以訪問的對象。堆用于動態(tài)分配內(nèi)存。這里需要著重說明的是引用指針是分配在棧上。聲明Class1 cls1時并不會給Class1的實例分配內(nèi)存,而是分配一個棧變量cls1(并設置為null),然后把它指向“堆”。退出方法:當方法退出時,它釋放了棧上所有內(nèi)存變量。換句話說,棧上所有的"Int"
4、變量都依據(jù)后進先出的邏輯被釋放掉了。要注意,此時不會釋放堆內(nèi)存,這種內(nèi)存稍后會被“垃圾收集器”釋放?,F(xiàn)在可能會有很多朋友奇怪為什么要分配2種內(nèi)存,而不是僅用一種內(nèi)存。如果仔細觀察,你會發(fā)現(xiàn)基本類型并不復雜,他們值包含簡單的值,如i=0。對象數(shù)據(jù)類型很復雜,它們會引用其它對象或基本類型。換句話說,它要保持其它多種多樣的引用,而每種類型必須存在內(nèi)存中。對象類型需要動態(tài)內(nèi)存而基本類型需要靜態(tài)內(nèi)存。如果需要分配動態(tài)內(nèi)存,那么就分配到堆上;反之在棧上。值類型與引用類型現(xiàn)在我們明白了棧和堆,接下來看值類型和引用類型。值類型的數(shù)據(jù)和內(nèi)存在同一個位置,而引用類型是一個指向內(nèi)存的指針。下面示例是一個整形數(shù)據(jù)類型
5、變量i被賦給另一個整形數(shù)據(jù)類型變量j。它們的內(nèi)存值都分配在棧上。當我們把一個int值分配給另外一個int值時,需要創(chuàng)建一個完全不同的拷貝。換句話說,你可以改變其中任何一個而不會影響另外一個。這種數(shù)據(jù)類型被稱為值類型。當我們創(chuàng)建一個對象,并把一個對象賦給另外一個對象時,它們的指針指向相同的內(nèi)存(如下圖,當我們把obj賦給obj1時,它們指向相同的內(nèi)存)。換句話說,我們改變其中一個,會影響到另外一個,這種類型稱為引用類型。那么那種類型是值類型和引用類型呢?在.NET中,依據(jù)數(shù)據(jù)類型,變量被分配到堆或棧上?!皊tring”和"Object"是引用類型,其他基本類型被分配到棧上,是
6、值類型,如下圖:裝箱與拆箱通過上面學習,我們學到了很多有用的東西,其中最有用的是明白了當把數(shù)據(jù)從棧移動到堆上時會有性能損失。如下圖實例,當我們把一個值類型裝箱為引用類型時,數(shù)據(jù)從棧移動到堆上。反之,數(shù)據(jù)從堆移動到棧上。這種在堆和棧之間的移動帶來了性能的損失。數(shù)據(jù)從值類型轉(zhuǎn)變?yōu)橐妙愋偷倪^程稱為“裝箱”,反之為“拆箱”。如果編譯上面的代碼,在ILDASM中看IL代碼就會發(fā)下如何進行裝箱拆箱操作的,如下:裝箱拆箱的性能影響為了揭示裝箱拆箱如何影響性能,我們把下面代碼運行10000次。一個函數(shù)有裝箱操作,另一個只有簡單代碼。我們用簡單的計時器看它們的運行時間。裝箱函數(shù)耗時 3542 MS,無裝箱操作的耗時2477MS。這說明在實際項目中,除非必須,否則應避免裝箱,拆箱操作。 備注:最近在CodeProject上看到<6 important .NET concepts: - Stack, heap, V
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 暖通畢業(yè)設計報告
- 鋼琴啟蒙教學課件
- 課件教學設計課件
- 地理組件教學課件圖片
- 特色課教學課件
- DB61∕T 1145-2018 城市軌道交通運營安全標志及使用規(guī)范
- 【佳木斯】2025年黑龍江撫遠市事業(yè)單位公開招聘工作人員15人筆試歷年典型考題及考點剖析附帶答案詳解
- 新手烘焙活動方案
- 05《人應當堅持正義》同步訓練【大單元教學】高二語文同步備課系列(統(tǒng)編版選擇性必修中冊)
- 春游公司策劃方案
- 2024年重慶開州區(qū)中醫(yī)院招聘筆試真題
- 海外倉一件代發(fā)服務合同范本下載
- 2025年山西省華艦體育控股集團有限公司所屬企業(yè)校園招聘19人筆試參考題庫附帶答案詳解
- 2025臺州市椒江區(qū)輔警考試試卷真題
- 國開本科《管理英語4》機考總題庫及答案
- 軟裝行業(yè)競品分析報告
- 腎占位超聲診斷
- T∕CACM 024-2017 中醫(yī)臨床實踐指南 穴位埋線減肥
- 化工企業(yè)交接班制度(附表格)-樣本模板
- 鎂合金半固態(tài)注射成型技術(shù)的研究與發(fā)展
- 企業(yè)管理咨詢重點總結(jié)
評論
0/150
提交評論