這篇文章主要介紹了c#中內(nèi)存管理與不安全代碼是什么,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
望城網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,望城網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為望城1000多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務(wù)好的望城做網(wǎng)站的公司定做!
***************************************內(nèi)存管理**********************************************************
===================================棧:
1,存儲著值類型(方法的參數(shù)存儲在棧中)
2,高性能
3,生存周期必須嵌套(缺點)
結(jié)構(gòu)是值類型,存儲在棧中。結(jié)構(gòu)實例化(new)不會在棧中分配空間
===================================托管堆(與傳統(tǒng)的堆相比有很顯著的優(yōu)勢):
1,存儲著引用類型(對象成員的值類型也存儲在堆上)
2,可以對數(shù)據(jù)的生存周期進行強大的控制
3,建立引用變量的過程比建立值變量的過程復雜,性能開銷大
===================================析構(gòu)函數(shù)(必須有垃圾回收器調(diào)用):
1,垃圾回收器銷毀對象之前執(zhí)行
2,c#無法確定垃圾回收器何時執(zhí)行,不能在析構(gòu)函數(shù)中放置 需要在某一時刻執(zhí)行的代碼
3,c#析構(gòu)函數(shù)的實現(xiàn),會延遲對象從內(nèi)存中銷毀的時間。
4,頻繁使用析構(gòu)函數(shù),對性能會有影響
===================================垃圾回收器
System.GC.Collect(); //強制對所有代進行垃圾回收
System.GC.SuppressFinalize(object); //不掉用對象的終結(jié)器(析構(gòu)函數(shù))
***************************************不安全代碼**********************************************************
===================================1,用unsafe關(guān)鍵字編寫不安全代碼
//配置:選中項目反鍵->屬性->生成->勾選允許不安全代碼
//標記類 unsafe public class Student { //標記字段 unsafe int* pAge; //標記方法 unsafe void getType(int* a) { //標記代碼段 unsafe { int* pAbc; //聲明指針語法 } } }
===================================2,指針的語法
unsafe { int* pWidth, pHeight; double* pResult; byte*[] pByte; //&:表示“取地址”,并把一個值數(shù)據(jù)類型轉(zhuǎn)換為指針,例如,int轉(zhuǎn)換為*int。這個運算稱為【尋址運算符】 //*:表示“獲取地址內(nèi)容”,把一個指針轉(zhuǎn)換為一個值數(shù)據(jù)類型(例如:*float轉(zhuǎn)換為float)。這個運算符被 //稱為“間接尋址運算符”(有時稱“取消引用運算符”) int a = 10;//聲明一個值類型,給它賦值10 int* pA, pB;//聲明2個指針 pA = &a;//取出值類型a的地址,賦值給指針pA pB = pA;//把指針pA的地址賦值給pB *pB = 20;//獲取pB指向的地址內(nèi)容,并賦值20 Console.WriteLine(a);//輸出20 }
===================================3,將指針強制轉(zhuǎn)化為整數(shù)類型
//只能轉(zhuǎn)化為uing、long、ulong類型
int a = 10; int* pA, pB; pA = &a; uint address = (uint)pA;//將指針地址強制轉(zhuǎn)換為整數(shù)類型 pB = (int*)address;//將整數(shù)類型強制轉(zhuǎn)換為指針 *pB = 20;//指針指向a Console.WriteLine(a);//輸出20
===================================4,指針類型的強制裝換
int b = 10; int* pIa; double* pDa; pIa = &b; pDa = (double*)pIa;//將int*強制轉(zhuǎn)換成double*
===================================5,void指針(不指向任何數(shù)據(jù)類型的指針)
int c = 10; int* pAA; pAA = &c; void* pVa = (void*)pAA;//轉(zhuǎn)換viod指針
===================================6,指針算數(shù)的運算(不允許對void指針進行運算)
p+x*(sizeof(T))
p:指針的地址
x:加上的數(shù)值
T:類型的大小
int d = 10; int* pId;//如果地址為100000 pId = &d; pId++;//結(jié)果:100004(int類型的大小為4個字節(jié))
===================================7,sizeof運算符(只能求出值類型的大小)
int x = sizeof(int);
===================================8,結(jié)構(gòu)指針:指針成員訪問運算符
①指針不能只想任何引用類型
②結(jié)構(gòu)里面不能包含引用類型
MyStruct* pStruct; MyStruct ms = new MyStruct(); pStruct = &ms; //--取地址內(nèi)容賦值為10 (*pStruct).X = 10; pStruct->X = 10; //--取地址賦值給pIs int* pIs1 = &(ms.X); int* pIs2 = &(pStruct->X); //結(jié)構(gòu) struct MyStruct { public int X = 1; public int Y = 2; }
===================================9,類成員指針
Person p = new Person(); fixed (int* pIp1 = &(p.X), pIp2 = &(p.Y)) { }//pIp1和pIp2的生命周期 //類 class Person { public int X; public int Y; }
===================================有趣的實驗
unsafe { //有趣的問題:為什么b的值改變了 //回答:因為i的地址指向了b int a = 10; int b = 20; int* i; i = &a;//將a的地址賦值給指針i i -= 1;//將i的地址-1(相當于向下移動4個字節(jié)(int類型的大小為4個字節(jié))) *i = 30;//取出i指針指向的內(nèi)容賦值為30 Console.WriteLine(b);//輸出30 }
感謝你能夠認真閱讀完這篇文章,希望小編分享的“c#中內(nèi)存管理與不安全代碼是什么”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學習!
網(wǎng)站欄目:c#中內(nèi)存管理與不安全代碼是什么
鏈接URL:http://www.chinadenli.net/article22/joijcc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導航、App開發(fā)、外貿(mào)建站、網(wǎng)頁設(shè)計公司、全網(wǎng)營銷推廣、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)