類:類是引用類型在堆上分配,類的實(shí)例進(jìn)行賦值只是復(fù)制了引用,都指向同一段實(shí)際對象分配的內(nèi)存類有構(gòu)造和析構(gòu)函數(shù)類可以繼承和被繼承
結(jié)構(gòu)體:結(jié)構(gòu)體是值類型在棧上分配(雖然棧的訪問速度比較堆要快,但棧的資源有限放),結(jié)構(gòu)體的賦值將分配產(chǎn)生一個(gè)新的對象。結(jié)構(gòu)體沒有構(gòu)造函數(shù),但可以添加。結(jié)構(gòu)體沒有析構(gòu)函數(shù)結(jié)構(gòu)體不可以繼承自另一個(gè)結(jié)構(gòu)體或被繼承,但和類一樣可以繼承自接口。
結(jié)構(gòu)體和類的聯(lián)系
1、定義和使用非常相似
例子如下:
public struct Student
{
string Name;
int Age;
}
public class Question
{
int Number;
string Content;
}
使用:
Student s=new Student();
Question q=new Question();
2、兩者都是container類型:這表示它們可以包含其他數(shù)據(jù)類型作為成員。
3、兩者都擁有成員:包括:構(gòu)造函數(shù)、方法、屬性、字段、常量、枚舉類型、事件、以及事件處理函數(shù)。
4、兩者的成員都有其各自的存取范圍。例如,可以將某一個(gè)成員聲明為Public,而將另一個(gè)成員聲明為Private。
5、兩者都可以實(shí)現(xiàn)接口。
6、兩者都可以公開一個(gè)默認(rèn)屬性,然而前提是這個(gè)屬性至少要取得一個(gè)自變量。
7、兩者都可以聲明和觸發(fā)事件,而且兩者都可以聲明委托(Delegate)。
結(jié)構(gòu)體和類的區(qū)別
1、存儲類型:結(jié)構(gòu)是值類型,存儲在棧上。類是引用類型,存儲在棧上和堆上,堆上存儲真實(shí)數(shù)據(jù),棧上存儲存儲地址,修改一個(gè)引用的值,另一個(gè)相同的引用的值就會(huì)發(fā)生改變。
2、繼承性:類是可以繼承的,它可以繼承其他的類或者接口,也可以被繼承,并且,類的許多特性是通過繼承來展現(xiàn)的,要阻止類的繼承,必須顯示的聲明sealed。結(jié)構(gòu)沒有繼承:它不能繼承另一個(gè)結(jié)構(gòu)或者類,也不能被繼承。也正因?yàn)槿绱耍Y(jié)構(gòu)不能有抽象成員。雖然結(jié)構(gòu)沒有明確的用sealed聲明,可是結(jié)構(gòu)是隱式的。結(jié)構(gòu)能夠繼承接口,方法和類繼承接口是一樣的。
3、初始化:類可以在聲明的時(shí)候初始化,結(jié)構(gòu)不能在申明的時(shí)候初始化(不能在結(jié)構(gòu)中初始化字段),否則報(bào)錯(cuò)。
4、構(gòu)造函數(shù):類和結(jié)構(gòu)都有自己默認(rèn)的構(gòu)造函數(shù)。在類中,一旦我們編寫了帶參數(shù)構(gòu)造函數(shù),默認(rèn)構(gòu)造函數(shù)就不存在了。當(dāng)我們要調(diào)用不帶參數(shù)的構(gòu)造函數(shù)來初始化對象時(shí),我們必須再自己編寫一個(gè)不帶參數(shù)的構(gòu)造函數(shù)。但是在結(jié)構(gòu)中,始終存在一個(gè)不帶參數(shù)的默認(rèn)構(gòu)造函數(shù),并且,這個(gè)構(gòu)造函數(shù)是不可替代的,不能重寫,也不能覆蓋,在結(jié)構(gòu)中,我們只能編寫帶參數(shù)的構(gòu)造函數(shù),不能編寫不帶參數(shù)的構(gòu)造函數(shù)。
5、析構(gòu)函數(shù):類有析構(gòu)函數(shù),但是結(jié)構(gòu)沒有析構(gòu)函數(shù)。
6、關(guān)鍵字:在類中可以使用但是在結(jié)構(gòu)中限制使用的關(guān)鍵字有:abstract、sealed、protected;Static關(guān)鍵字可以用在類名前面用來聲明靜態(tài)類,但是不能用在struct前面,不存在靜態(tài)結(jié)構(gòu)。
使用說明
結(jié)構(gòu)存儲在棧中,而棧有1個(gè)特點(diǎn),就是空間較小,但是訪問速度較快,堆空間較大,但是訪問速度相對較慢。所以當(dāng)我們描述1個(gè)輕量級對象的時(shí)候,可以將其定義為結(jié)構(gòu)來提高效率。比如點(diǎn),矩形,顏色,這些對象是輕量級的對象,因?yàn)槊枋鏊麄儯恍枰倭康淖侄巍.?dāng)描述1個(gè)重量級對象的時(shí)候,我們知道類的對象是存儲在堆空間中的,我們就將重量級對象定義為類。 他們都表示可以包含數(shù)據(jù)成員和函數(shù)成員的數(shù)據(jù)結(jié)構(gòu)。與類不同的是,結(jié)構(gòu)是值類型并且不需要堆分配。結(jié)構(gòu)類型的變量直接包含結(jié)構(gòu)的數(shù)據(jù),而類類型的變量包含對數(shù)據(jù)的引用(該變量稱為對象)。 struct 類型適合表示如點(diǎn)、矩形和顏色這樣的輕量對象。盡管可能將一個(gè)點(diǎn)表示為類,但結(jié)構(gòu)在某些方案中更有效。在一些情況下,結(jié)構(gòu)的成本較低。例如,如果聲明一個(gè)含有 1000 個(gè)點(diǎn)對象的數(shù)組,則將為引用每個(gè)對象分配附加的內(nèi)存。所以結(jié)構(gòu)適合表示1個(gè)輕量級對象。
根據(jù)以上比較,我們可以得出一些輕量級的對象最好使用結(jié)構(gòu)體,但數(shù)據(jù)量大或有復(fù)雜處理邏輯對象最好使用類。
評論
查看更多