c#基礎(chǔ)

1.值類型和引用類型的區(qū)別

? ??????I.簡(jiǎn)單比較:

? ? ? ? 值類型的變量直接存儲(chǔ)數(shù)據(jù),引用類型的變量持有的是數(shù)據(jù)的引用,數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)堆中。

? ? ? ? 值類型(value?type):byte,short,int,long,float,double,char,bool,struct,decimal都是值類型。值類型變量聲明后,不管是否已經(jīng)賦值,編譯器為其分配內(nèi)存。

? ? ? ? 引用類型(reference type):string?和class統(tǒng)稱為引用類型。當(dāng)聲明一個(gè)類時(shí),只在棧中分配一小片內(nèi)存用于容納一個(gè)地址,而此時(shí)并沒(méi)有為其分配堆上的內(nèi)存空間。當(dāng)使用new創(chuàng)建一個(gè)類的實(shí)例時(shí),分配堆上的空間,并把堆上空間的地址保存到棧上分配的小片空間中。

? ? ? ? 值類型的實(shí)例通常是在線程棧上分配的(靜態(tài)分配),但是某些情況下可以存儲(chǔ)在堆中(如果值類型是引用類型的成員變量,則跟隨引用類型,存儲(chǔ)在堆上。)。引用類型的對(duì)象總是在進(jìn)程堆中分配(動(dòng)態(tài)分配)。?

? ? ? ? 值類型存儲(chǔ)在內(nèi)存堆上示例:


值類型是引用類型的成員變量
值類型跟隨引用對(duì)象存儲(chǔ)在堆中

? ? ? ? II.相同點(diǎn)

? ? ? ? 引用類型可以實(shí)現(xiàn)接口,值類型中的結(jié)構(gòu)體也可以實(shí)現(xiàn)接口

? ? ? ? 引用類型和值類型都繼承自System.Object類(值類型繼承自System.ValueType,隱試?yán)^承自System.Object)

? ? ? ? III.不同點(diǎn)

? ? ? ??1)范圍方面

? ? ? ? c#的值類型包括:結(jié)構(gòu)體(數(shù)據(jù)類型、bool型、用戶定義的結(jié)構(gòu)體),枚舉,可空類型。

? ? ? ? c#的引用類型包括:數(shù)組,用戶定義的類,接口,委托,object,字符串。

? ? ? ? 2)內(nèi)存分配方面

? ? ? ? 數(shù)組的元素不管是引用類型還是值類型,都存儲(chǔ)在托管堆上。

? ? ? ? 引用類型在棧中存儲(chǔ)一個(gè)引用,其實(shí)際的存儲(chǔ)位置位于托管堆。簡(jiǎn)稱引用類型部署在托管堆上。而值類型總是分配在它聲明的地方:作為字段是,跟隨其所屬的變量(實(shí)例)存儲(chǔ);作為局部變量時(shí),存儲(chǔ)在棧上。(棧的內(nèi)存是自動(dòng)釋放的,堆內(nèi)存是.NET中會(huì)由GC來(lái)自動(dòng)釋放)

? ? ? ? 3)適用場(chǎng)合

? ? ? ? 值類型在內(nèi)存管理方面具有更好的效率,并且不支持多態(tài),適合用作存儲(chǔ)數(shù)據(jù)的載體;引用類型支持多態(tài),適合用于定義應(yīng)用程序的行為。

? ? ? ? 引用類型可以派生出新的類型,而值類型不能,因?yàn)樗械闹殿愋投际敲芊獾模╯eal);

? ? ? ? 引用類型可以包含null值,值類型不能(可空類型功能允許將null賦給值類型,如int? a = null;);

? ? ? ? 引用類型變量的賦值只賦值對(duì)象的引用,而不復(fù)制對(duì)象本身。而將一個(gè)值類型變量賦給另一個(gè)值類型變量時(shí),將復(fù)制包含的值。(當(dāng)然,兩者賦值變量的改變不會(huì)改變?cè)兞康闹担?/p>

2.字節(jié)

? ? ? ? 字節(jié)(byte)是計(jì)算機(jī)信息技術(shù)用于計(jì)量存儲(chǔ)容量的一種計(jì)量單位,通常情況下一字節(jié)等于八位,也在一些計(jì)算機(jī)編程語(yǔ)言中表示數(shù)據(jù)類型和語(yǔ)言字符。

? ? ? ? I.B與bit

? ? ? ? 數(shù)據(jù)存儲(chǔ)是以字節(jié)(Byte)為單位,數(shù)據(jù)傳輸大多是以位(bit,又名比特)為單位,一個(gè)位就代表一個(gè)0或1(即二進(jìn)制),每8個(gè)位(bit,簡(jiǎn)寫為b)組成一個(gè)字節(jié)(Byte,簡(jiǎn)寫為B),是最小一級(jí)的信息單位。

? ? ? ? II.8中基本數(shù)據(jù)類型占字節(jié)數(shù)


3.抽象函數(shù)、虛函數(shù)、接口、抽象類

I.抽象函數(shù)

? ? ? ? 抽象方法必須聲明在抽象類中,聲明抽象方法時(shí),不能使用virtual、static、private修飾符。在抽象類中抽象方法不提供實(shí)現(xiàn)。抽象方法不包含方法主體,必須由派生類以override方式實(shí)現(xiàn)此放方法。

II.虛函數(shù)

? ? ? ? 虛函數(shù)在編譯期間是不被靜態(tài)編譯的,它的相對(duì)地址不不確定的,它會(huì)根據(jù)運(yùn)行時(shí)對(duì)象實(shí)例來(lái)動(dòng)態(tài)判斷要調(diào)用的函數(shù),其中那個(gè)申明是定義的類叫申明類,那個(gè)執(zhí)行時(shí)實(shí)例化的類叫實(shí)例類。

? ? ? ? 當(dāng)調(diào)用一個(gè)對(duì)象的函數(shù)時(shí),系統(tǒng)會(huì)直接去檢查這個(gè)對(duì)象申明定義的類,即申明類,看所調(diào)用的函數(shù)是否為虛函數(shù);如果不是虛函數(shù),那么就直接執(zhí)行該函數(shù)。而如果有virtual關(guān)鍵字,也就是一個(gè)虛函數(shù),那么這個(gè)時(shí)候它就不會(huì)立刻執(zhí)行該函數(shù),而是轉(zhuǎn)去檢查對(duì)象的實(shí)例類,是否重新實(shí)現(xiàn)了該虛函數(shù),如果重新實(shí)現(xiàn),它就不會(huì)再找了,而馬上執(zhí)行該實(shí)例類中這個(gè)重新實(shí)現(xiàn)的函數(shù)。如果沒(méi)有,系統(tǒng)就會(huì)不停地往上找實(shí)例類,并對(duì)父類重復(fù)剛才在實(shí)例類里的檢查,直到找到了第一個(gè)重寫了該虛函數(shù)的父類位置,然后執(zhí)行該父類里重寫的函數(shù)。

????????一般函數(shù)在編譯時(shí)就靜態(tài)地編譯到了執(zhí)行文件中,其相對(duì)地址在程序運(yùn)行期間是不發(fā)生變化的,也就是寫死了的。

III.接口

接口是指定一組函數(shù)成員而不實(shí)現(xiàn)成員的引用類型,其他類型和接口可以繼承接口,接口主要有以下特點(diǎn):

1)通過(guò)接口可以實(shí)現(xiàn)多重繼承,c#接口的成員不能有public、protected、internal、private等修飾符。原因是接口里面的方法都需要由外面接口實(shí)現(xiàn)去實(shí)現(xiàn)方法體,所以修飾符必須是public。

2)接口成員不能有new、static、abstract、override、virtual修飾符(當(dāng)一個(gè)接口實(shí)現(xiàn)一個(gè)接口,這兩個(gè)接口有相同的方法時(shí),可以使用new關(guān)鍵字隱藏父接口中的方法)。

3)接口中只包含成員的簽名,接口沒(méi)有構(gòu)造函數(shù),所有不能直接使用new對(duì)接口進(jìn)行實(shí)例化。接口中只能包含方法、屬性、事件和索引的組合。接口一旦被實(shí)現(xiàn),實(shí)現(xiàn)類必須實(shí)現(xiàn)接口中所有成員,除非實(shí)現(xiàn)類本身是抽象類。??

4)接口可以被多繼承

IV.抽象類 ? ?

? ? ? ? 不能被初始化的類被叫做抽象類,它們只提供部分實(shí)現(xiàn),但是另一個(gè)類可以繼承它并且能創(chuàng)建他們的實(shí)例。抽象類能夠被用于類、方法、屬性、索引器和事件,使用abstract在一個(gè)類聲明中表示該類時(shí)抽象類,由其派生類實(shí)現(xiàn)。抽象類不能被封閉。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容