?.值類型的變量直接存儲(chǔ)數(shù)據(jù),?引?類型的變量持有的是數(shù)據(jù)的引?,數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)堆中。
值類型(value type):byte,short,int,long,float,double,decimal,char,bool 和 struct 統(tǒng)稱為值類型。值類型變量聲明后,不管是否已經(jīng)賦值,編譯器為其分配內(nèi)存。
引?類型(reference type):string 和 class統(tǒng)稱為引?類型。當(dāng)聲明?個(gè)類時(shí),只在棧中分配???內(nèi)存?于容納?個(gè)地址,?此時(shí)并沒有為其分配堆上的內(nèi)存空間。當(dāng)使? new 創(chuàng)建?個(gè)類的實(shí)例時(shí),分配堆上的空間,并把堆上空間的地址保存到棧上分配的??空間中。值類型的實(shí)例通常是在線程棧上分配的(靜態(tài)分配),但是在某些情形下可以存儲(chǔ)在堆中。引?類型的對(duì)象總是在進(jìn)程堆中分配(動(dòng)態(tài)分配)。
不同點(diǎn):
1)范圍?? C#的值類型包括:結(jié)構(gòu)體(數(shù)值類型、bool型、?戶定義的結(jié)構(gòu)體),枚舉,可空類型。C#的引?類型包括:數(shù)組,?戶定義的類、接?、委托,object,字符串。
2)內(nèi)存分配?? 數(shù)組的元素不管是引?類型還是值類型,都存儲(chǔ)在托管堆上。【注意:托管堆和進(jìn)程堆,是?種么?另外:線程堆棧(Thread Stack)和托管堆(Managed Heap),?后會(huì)再單獨(dú)涉及】 引?類型在棧中存儲(chǔ)?個(gè)引?,其實(shí)際的存儲(chǔ)位置位于托管堆。簡(jiǎn)稱引?類型部署在托管推上。?值類型總是分配在它聲明的地?:作為字段時(shí),跟隨其所屬的變量(實(shí) 例)存儲(chǔ);作為局部變量時(shí),存儲(chǔ)在棧上。(棧的內(nèi)存是?動(dòng)釋放的,堆內(nèi)存是.NET中會(huì)由GC來?動(dòng)釋放)
二、如何避免
減少new產(chǎn)?對(duì)象的次數(shù) 使?公?的對(duì)象,即靜態(tài)成員Static,但要謹(jǐn)慎使? 將String換成StringBuilder拼接字符串,string容易導(dǎo)致內(nèi)存泄露使?對(duì)象池GamObject Pool在字符串暫存池中的是不會(huì)被GC的避免使?foreach,盡量使?for循環(huán)
三.接?是指定?組函數(shù)成員?不實(shí)現(xiàn)他們的引?類型。所以只能類和結(jié)構(gòu)來實(shí)現(xiàn)接?,在繼承該接?的類??要實(shí)現(xiàn)接?的所有?法。
四.輸出結(jié)果:AB
五.Assembly.LoadFrom()加載dll
assembly.GetType(“ClassA”);
type.GetMethod(“MethodA”);
六.unity不?持多線程,但可以使?多線程的類庫進(jìn)?多線程編程
Unity使?多線程注意:
變量都是共享的(都能指向相同的內(nèi)存地址)UnityEngine的API不能在分線程運(yùn)? UnityEngine定義的基本結(jié)構(gòu)(int,float,Struct定義的數(shù)據(jù)類型)可以在分線程計(jì)算,如 Vector3(Struct)可以,但Texture2d(class,根?類為Object)不可以。 UnityEngine定義的基本類型的函數(shù)可以在分線程運(yùn)?Debug.Log()?持在?線程中調(diào)?
更多關(guān)于“unity游戲開發(fā)培訓(xùn)”的問題,歡迎咨詢千鋒教育在線名師。千鋒教育多年辦學(xué),課程大綱緊跟企業(yè)需求,更科學(xué)更嚴(yán)謹(jǐn),每年培養(yǎng)泛IT人才近2萬人。不論你是零基礎(chǔ)還是想提升,都可以找到適合的班型,千鋒教育隨時(shí)歡迎你來試聽。