日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
淺析C#編程中的內存管理

C#編程的一個優(yōu)點是程序員不需要關心具體的內存管理,尤其是垃圾收集器會處理所有的內存清理工作。雖然不必手工管理內存,但如果要編寫高質量的代碼,還是要理解后臺發(fā)生的事情,理解C#的內存管理。本文主要介紹給變量分配內存時計算機內存中發(fā)生的情況。

C#將數(shù)據(jù)分為兩種:值數(shù)據(jù)類型和引用數(shù)據(jù)類型,這兩種數(shù)據(jù)類型存儲在內存中的不同的地方:值數(shù)據(jù)類型存儲在堆棧中,而引用類型存儲在內存的托管堆中。

一、內存簡介

Windows使用一個系統(tǒng):虛擬尋址系統(tǒng)。這個系統(tǒng)的作用是將程序可用的內存地址映射到硬件內存中的實際地址上。其實際結果就是32位的機子上每個進程都可以使用4GB的內存,當然,64位機這個數(shù)字就大了去了。這4GB的內存實際上包含了程序的所有的部分:可執(zhí)行代碼,DLL以及程序運行時使用的所有變量的內容。這個4GB的內存成為虛擬地址空間或虛擬內存。為方便,這里成為內存。

4GB中的每個存儲單元都是從零開始向上存儲的。要訪問存儲在內存中的某個空間中的值,就必須提供表示該存儲單元的一個數(shù)字。在高級編程語言中,編譯器的一個重要作用就是負責將人們可以理解的變量名稱變?yōu)樘幚砥骺梢岳斫獾膬却娴刂贰?/p>

二、堆棧

在內存中,有一個區(qū)域成為堆棧,存儲對象

對象成員的值數(shù)據(jù)類型調用方法時,傳遞給所有方法的參數(shù)的副本注意:調用方法時,堆棧存儲的是所有參數(shù)的副本,因此,經值類型A傳遞給函數(shù),A的值是不會變化的。當然,引用類型是會變化的,因為在堆棧中存儲的是引用類型的地址,這在后面會有詳細的介紹。

下面以一個例子來說明堆棧的工作方式,如下面的代碼:

1: { 

2: int a; 

3: //do something; 

4: { 

5: int b; 

6: //do something 

7: } 

8: }  

首先聲明a,在內部的代碼塊中聲明b,然后內部的代碼塊終止,b就出了作用域,最后a出作用域。所以b的生命周期總是包含在a的生命周期內,在釋放變量的時候,其順序總是和分配內存的順序是相反的。即:變量的生存周期都是嵌套的。這就是堆棧的工作方式。

三、托管堆

堆棧具有相當高的性能,但是變量的生命周期必須是嵌套的,這個要求在有的時候過于苛刻。我們希望有一種別的方法來分配內存,存儲一些數(shù)據(jù),并在方法退出的很長一段時間內,這些數(shù)據(jù)仍然是可用的,這時,就使用托管堆。

托管堆(簡稱堆)是內存中的另外一個區(qū)域,我們仍然用一個例子來說明堆的工作方式,如下面代碼:

1: {

2: Customer customer1;

3: customer1=new Customer();

4: Customer customer2=new Customer();

5: //do something

6: } 

首先,聲明一個Customer:customer1,在堆棧上給這個引用分配存儲控件。請注意:僅僅是給這個引用分配存儲空間,并不是實際的Customer對象。customer1占用4個字節(jié)的空間(32位機),來表示Customer對象在內存中的地址。

然后,執(zhí)行第二行代碼,完成以下操作:

在堆上分配存儲空間,用來存儲Customer對象,注意:這里是Customer對像。

將變量customer1的值設為分配給Customer對象的內存地址從這個例子中可以看出,建立引用類型的變量的過程要比獎勵值類型變量的過程復雜,且不避免的有性能的降低。但是,我們可以將一個引用變量的值賦給另一個引用變量,當一個變量出作用域時,它會從堆棧中刪除,但是對象的數(shù)據(jù)仍然保留在內存中,知道程序停止。

這樣,我們在將一個引用變量A傳遞給函數(shù)時,僅僅是將變量A的引用傳遞給了函數(shù),即:僅僅是在堆棧上分配內存,即變量B兩者指向同一個內存地址。因此,當變量B發(fā)生變化時,變量A也會發(fā)生變化。

四、裝箱和拆箱

裝箱和拆箱就是值類型和引用類型的項目轉化,裝箱可以將值類型轉化為引用類型,拆箱的作用正好相反,經引用類型轉化為值類型。

五、垃圾收集

一般情況下。NET運行庫會在認為需要的時候運行垃圾收集器來釋放托管資源,這在大多數(shù)情況下,足夠了。就是說我們沒有必要去關心內存。但在有的情況下,我們會強制垃圾回收集器在代碼的某個地方運行,釋放內存。這就用到了System.GC.Collect()。System.GC表示一個垃圾收集器。這種情況很少,例如:代碼中大量的對象剛剛停止引用,就適合調用垃圾收集器。


網(wǎng)頁名稱:淺析C#編程中的內存管理
標題網(wǎng)址:http://www.dlmjj.cn/article/cdccjcc.html