溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

c#中內(nèi)存管理與不安全代碼是什么

發(fā)布時(shí)間:2022-01-15 14:19:37 來(lái)源:億速云 閱讀:147 作者:小新 欄目:編程語(yǔ)言

這篇文章主要介紹了c#中內(nèi)存管理與不安全代碼是什么,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

***************************************內(nèi)存管理**********************************************************

===================================棧:
1,存儲(chǔ)著值類型(方法的參數(shù)存儲(chǔ)在棧中)


2,高性能


3,生存周期必須嵌套(缺點(diǎn))

結(jié)構(gòu)是值類型,存儲(chǔ)在棧中。結(jié)構(gòu)實(shí)例化(new)不會(huì)在棧中分配空間

===================================托管堆(與傳統(tǒng)的堆相比有很顯著的優(yōu)勢(shì)):

1,存儲(chǔ)著引用類型(對(duì)象成員的值類型也存儲(chǔ)在堆上)


2,可以對(duì)數(shù)據(jù)的生存周期進(jìn)行強(qiáng)大的控制


3,建立引用變量的過(guò)程比建立值變量的過(guò)程復(fù)雜,性能開(kāi)銷(xiāo)大

===================================析構(gòu)函數(shù)(必須有垃圾回收器調(diào)用):


1,垃圾回收器銷(xiāo)毀對(duì)象之前執(zhí)行


2,c#無(wú)法確定垃圾回收器何時(shí)執(zhí)行,不能在析構(gòu)函數(shù)中放置 需要在某一時(shí)刻執(zhí)行的代碼


3,c#析構(gòu)函數(shù)的實(shí)現(xiàn),會(huì)延遲對(duì)象從內(nèi)存中銷(xiāo)毀的時(shí)間。


4,頻繁使用析構(gòu)函數(shù),對(duì)性能會(huì)有影響

===================================垃圾回收器

System.GC.Collect();  //強(qiáng)制對(duì)所有代進(jìn)行垃圾回收
System.GC.SuppressFinalize(object);  //不掉用對(duì)象的終結(jié)器(析構(gòu)函數(shù))

 ***************************************不安全代碼**********************************************************

===================================1,用unsafe關(guān)鍵字編寫(xiě)不安全代碼

//配置:選中項(xiàng)目反鍵->屬性->生成->勾選允許不安全代碼

    //標(biāo)記類
    unsafe public class Student
    {
        //標(biāo)記字段
        unsafe int* pAge;
        //標(biāo)記方法
        unsafe void getType(int* a)
        {
            //標(biāo)記代碼段
            unsafe
            {
                int* pAbc;      //聲明指針語(yǔ)法
            }
        }
    }

===================================2,指針的語(yǔ)法

            unsafe
            {
                int* pWidth, pHeight;
                double* pResult;
                byte*[] pByte;
                //&:表示“取地址”,并把一個(gè)值數(shù)據(jù)類型轉(zhuǎn)換為指針,例如,int轉(zhuǎn)換為*int。這個(gè)運(yùn)算稱為【尋址運(yùn)算符】
                //*:表示“獲取地址內(nèi)容”,把一個(gè)指針轉(zhuǎn)換為一個(gè)值數(shù)據(jù)類型(例如:*float轉(zhuǎn)換為float)。這個(gè)運(yùn)算符被
                    //稱為“間接尋址運(yùn)算符”(有時(shí)稱“取消引用運(yùn)算符”)
                int a = 10;//聲明一個(gè)值類型,給它賦值10
                int* pA, pB;//聲明2個(gè)指針
                pA = &a;//取出值類型a的地址,賦值給指針pA
                pB = pA;//把指針pA的地址賦值給pB
                *pB = 20;//獲取pB指向的地址內(nèi)容,并賦值20
                Console.WriteLine(a);//輸出20
            }

===================================3,將指針強(qiáng)制轉(zhuǎn)化為整數(shù)類型

//只能轉(zhuǎn)化為uing、long、ulong類型

int a = 10;
int* pA, pB;
pA = &a;
uint address = (uint)pA;//將指針地址強(qiáng)制轉(zhuǎn)換為整數(shù)類型
pB = (int*)address;//將整數(shù)類型強(qiáng)制轉(zhuǎn)換為指針
*pB = 20;//指針指向a
Console.WriteLine(a);//輸出20

===================================4,指針類型的強(qiáng)制裝換

int b = 10;
int* pIa;
double* pDa;
pIa = &b;
pDa = (double*)pIa;//將int*強(qiáng)制轉(zhuǎn)換成double*

===================================5,void指針(不指向任何數(shù)據(jù)類型的指針)

int c = 10;
int* pAA;
pAA = &c;
void* pVa = (void*)pAA;//轉(zhuǎn)換viod指針

===================================6,指針?biāo)銛?shù)的運(yùn)算(不允許對(duì)void指針進(jìn)行運(yùn)算)

p+x*(sizeof(T))
p:指針的地址
x:加上的數(shù)值
T:類型的大小

int d = 10;
int* pId;//如果地址為100000
pId = &d;
pId++;//結(jié)果:100004(int類型的大小為4個(gè)字節(jié))

===================================7,sizeof運(yùn)算符(只能求出值類型的大小)

int x = sizeof(int);

===================================8,結(jié)構(gòu)指針:指針成員訪問(wèn)運(yùn)算符

①指針不能只想任何引用類型
②結(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;
}

===================================有趣的實(shí)驗(yàn)

unsafe
{
//有趣的問(wèn)題:為什么b的值改變了
//回答:因?yàn)閕的地址指向了b
int a = 10;
int b = 20;
int* i;
i = &a;//將a的地址賦值給指針i
i -= 1;//將i的地址-1(相當(dāng)于向下移動(dòng)4個(gè)字節(jié)(int類型的大小為4個(gè)字節(jié)))
*i = 30;//取出i指針指向的內(nèi)容賦值為30
Console.WriteLine(b);//輸出30
}

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“c#中內(nèi)存管理與不安全代碼是什么”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI