明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

結(jié)構(gòu) Structure

[摘要]如果對(duì)類比較熟悉,先看看結(jié)構(gòu)和類的異同點(diǎn):結(jié)構(gòu)和類Visual Basic .NET 統(tǒng)一了結(jié)構(gòu)和類的語法,結(jié)果就是兩個(gè)實(shí)體都支持大多數(shù)的相同功能。但是,在結(jié)構(gòu)和類之間還有著重要的區(qū)別。相同點(diǎn)結(jié)構(gòu)和...
如果對(duì)類比較熟悉,先看看結(jié)構(gòu)和類的異同點(diǎn):

結(jié)構(gòu)和類
Visual Basic .NET 統(tǒng)一了結(jié)構(gòu)和類的語法,結(jié)果就是兩個(gè)實(shí)體都支持大多數(shù)的相同功能。但是,在結(jié)構(gòu)和類之間還有著重要的區(qū)別。

相同點(diǎn)
結(jié)構(gòu)和類在以下方面相同:

兩者都屬于“容器”類型,表示它們可以包含其他類型作為成員。
兩者都具有成員,成員可以包括構(gòu)造函數(shù)、方法、屬性、字段、常數(shù)、枚舉、事件和事件處理程序。
兩者的成員都具有單獨(dú)的可訪問性。例如,一個(gè)成員可以聲明為 Public,而另一個(gè)可以聲明為 Private。
都可實(shí)現(xiàn)接口。
都有共享的構(gòu)造函數(shù),有或沒有參數(shù)。
兩者都可以公開默認(rèn)屬性,只要該屬性至少帶有一個(gè)參數(shù)。
兩者都可以聲明和引發(fā)事件,而且兩者都可以聲明委托。
不同點(diǎn)
結(jié)構(gòu)和類在以下方面有所不同:

結(jié)構(gòu)是值類型,而類是引用類型。
結(jié)構(gòu)使用堆棧分配,類使用堆分配。
所有的結(jié)構(gòu)成員都默認(rèn)為 Public;類變量和常量默認(rèn)為 Private,而其他的類成員默認(rèn)為 Public。類成員的這一行為提供與 Visual Basic 6.0 默認(rèn)值系統(tǒng)的兼容。
結(jié)構(gòu)必須至少具有一個(gè)非共享變量或事件成員;而類可以完全是空的。
結(jié)構(gòu)成員不能聲明為 Protected,類成員可以。
只有 Shared Sub 結(jié)構(gòu)過程才能處理事件,并且只能使用 AddHandler 語句;而任何類過程都可以處理事件,并且可以使用 Handles 關(guān)鍵字或 AddHandler 語句。
結(jié)構(gòu)變量聲明不能指定初始值、New 關(guān)鍵字或數(shù)組初始大小,類變量聲明可以。
結(jié)構(gòu)從 ValueType 類隱式繼承,不能從其他類型繼承,類可以從除 ValueType 之外的其他任何類繼承。
結(jié)構(gòu)是不可繼承的;而類可以繼承。
結(jié)構(gòu)從不終止,所以公共語言運(yùn)行庫 (CLR) 從不在任何結(jié)構(gòu)上調(diào)用 Finalize 方法,類可由垃圾回收器終止,當(dāng)檢測到?jīng)]有剩下的活動(dòng)引用時(shí),垃圾回收器將在類上調(diào)用 Finalize。
結(jié)構(gòu)不需要構(gòu)造函數(shù);而類需要。
結(jié)構(gòu)僅當(dāng)沒有參數(shù)時(shí)可以有非共享的構(gòu)造函數(shù);類無論有沒有參數(shù)都可以。
每一個(gè)結(jié)構(gòu)都有不帶參數(shù)的隱式公共構(gòu)造函數(shù)。此構(gòu)造函數(shù)將結(jié)構(gòu)的所有數(shù)據(jù)成員初始化為默認(rèn)值。不能重定義此行為。

實(shí)例和變量
由于結(jié)構(gòu)是值類型,每個(gè)結(jié)構(gòu)變量都永久地綁定到一個(gè)單獨(dú)的結(jié)構(gòu)實(shí)例。但類是引用類型,對(duì)象變量可引用各種類實(shí)例。此區(qū)別在下列方面影響結(jié)構(gòu)和類的使用:

結(jié)構(gòu)變量使用結(jié)構(gòu)的無參數(shù)構(gòu)造函數(shù)隱式包含成員初始化。因此,Dim S As Struct1 等效于 Dim S As Struct1 = New Struct1()。
當(dāng)將一個(gè)結(jié)構(gòu)變量賦給另一個(gè),或傳遞一個(gè)結(jié)構(gòu)實(shí)例到過程參數(shù),所有變量成員的當(dāng)前值都被復(fù)制到新結(jié)構(gòu)中。當(dāng)將一個(gè)對(duì)象變量賦給另一個(gè),或傳遞一個(gè)對(duì)象變量到過程,僅有引用指針被復(fù)制。
可以將值 Nothing 賦給結(jié)構(gòu)變量,但實(shí)例繼續(xù)保持與變量的關(guān)聯(lián)。盡管賦值重新初始化了變量成員,仍可以調(diào)用其方法并訪問其數(shù)據(jù)成員。相比之下,如果將對(duì)象變量設(shè)為 Nothing,將其與任何類實(shí)例斷開關(guān)聯(lián),在給它賦予另一個(gè)實(shí)例前,不能通過變量訪問其他成員。
對(duì)象變量可以有在不同時(shí)間賦給它的不同的類實(shí)例,幾個(gè)對(duì)象變量可以同時(shí)引用同一個(gè)類實(shí)例。當(dāng)通過指向同一實(shí)例的另一個(gè)變量訪問時(shí),更改的類成員的值會(huì)影響這些成員。但是,結(jié)構(gòu)成員獨(dú)立存在于其自身實(shí)例中。更改其值不會(huì)在其他任何結(jié)構(gòu)變量中反映出來,即使是在同一 Structure 聲明的其他實(shí)例中。
兩個(gè)結(jié)構(gòu)的等效性測試必須在成員對(duì)成員的測試中進(jìn)行。兩個(gè)對(duì)象變量可使用 Equals 方法進(jìn)行比較。Equals 指示兩個(gè)變量是否指向同一實(shí)例。
Structure 語句
Structure 語句只能在模塊、命名空間或文件級(jí)出現(xiàn)。這就是說可以在源文件或模塊、接口或類內(nèi)部聲明結(jié)構(gòu),但不能在過程內(nèi)部進(jìn)行聲明。也可以在一個(gè)結(jié)構(gòu)中定義另一個(gè)結(jié)構(gòu),但不能通過外部結(jié)構(gòu)訪問內(nèi)部結(jié)構(gòu)的成員。而是必須聲明一個(gè)內(nèi)部結(jié)構(gòu)的數(shù)據(jù)類型變量。

可以從聲明結(jié)構(gòu)的模塊或類內(nèi)的任何位置訪問它們。默認(rèn)情況下,結(jié)構(gòu)為 Friend。若要更詳細(xì)地指定可訪問性,請?jiān)?Structure 語句中包括 Public、Friend、Protected Friend 或 Private。

必須聲明結(jié)構(gòu)的每一數(shù)據(jù)成員。這意味著 variabledeclarations 部分中的每一語句必須使用 Dim、Friend、Private 或 Public。由于無法從結(jié)構(gòu)中繼承,因此結(jié)構(gòu)成員不能是 Protected 或 Protected Friend。但結(jié)構(gòu)本身可以是 Protected 或 Protected Friend。

如果 Option Strict 是 On,則在每一個(gè)成員聲明中還必須包含 As 子句。用 Dim 聲明的成員默認(rèn)為 Public 訪問,未用 As 子句聲明的成員默認(rèn)為 Object 數(shù)據(jù)類型。

在結(jié)構(gòu)中必須至少定義一個(gè)非共享變量或事件。在結(jié)構(gòu)中不能只包含常數(shù)、屬性和過程,即使某些成員是非共享的。

結(jié)構(gòu)成員的范圍是整個(gè)結(jié)構(gòu)。

不能將結(jié)構(gòu)的任何數(shù)據(jù)成員的值初始化成其聲明的一部分。必須通過結(jié)構(gòu)上參數(shù)化的構(gòu)造函數(shù)初始化數(shù)據(jù)成員,或者在創(chuàng)建了該結(jié)構(gòu)的實(shí)例后將值賦給該成員。

結(jié)構(gòu)支持的許多功能與類支持的一樣。例如,結(jié)構(gòu)可以擁有屬性和方法,可以實(shí)現(xiàn)接口,也可以擁有參數(shù)化的構(gòu)造函數(shù)。但是,在某些地方(例如繼承、聲明和用法)結(jié)構(gòu)和類之間存在著重大的差異。