共用方式為


結構與類別 (Visual Basic)

Visual Basic 會統一結構和類別的語法,結果兩個實體都支援大部分相同的功能。 不過,結構和類別之間也有重要的差異。

類別的優點是做為參考型別, 傳遞參考比傳遞結構變數及其所有數據更有效率。 另一方面,結構不需要在全域堆積上配置記憶體。

因為您無法繼承自 結構,所以結構應該只用於不需要擴充的物件。 當您想要建立的物件具有較小的實例大小時,請使用 結構,並考慮類別與結構的效能特性。

相似 之 處

結構與類別在下列方面類似:

  • 兩者都是 容器 類型,這表示它們包含其他類型做為成員。

  • 兩者都有成員,可以包含建構函式、方法、屬性、欄位、常數、列舉、事件和事件處理程式。

  • 兩者的成員都可以具有個別的存取層級。 例如,可以宣告一個成員為Public,另一個成員為Private

  • 兩者都可以實作介面。

  • 兩者都可以有共用的建構函式,無論是否具有參數。

  • 兩者都可以公開 預設屬性,前提是該屬性至少接受一個參數。

  • 兩者都可以宣告和引發事件,而且兩者都可以宣告委派。

差異

結構與類別在下列特定情況下不同:

  • 結構是 實值型別;類別是 參考型別。 結構類型的變數包含結構的數據,而不是像類別類型一樣包含數據的參考。

  • 結構使用堆疊配置;類別使用堆積配置。

  • 所有結構元素預設為 Public ;類別變數和常數預設為 Private ,而其他類別成員則預設為 Public 。 類別成員的這個行為提供與 Visual Basic 6.0 預設系統的相容性。

  • 結構必須至少有一個非共用變數或非共用的非自定義事件元素;類別可以完全空白。

  • 結構元素不能宣告為 Protected,但類別成員可以。

  • 結構程式只有在它是 共享Sub 程式,而且只能透過 AddHandler 語句來處理事件;任何類別程式都可以使用 Handle 關鍵詞或 AddHandler 語句來處理事件。 如需詳細資訊,請參閱 事件

  • 結構變數宣告無法指定初始化運算式或陣列的初始大小;類別變數宣告可以指定。

  • 結構隱含繼承自 System.ValueType 類別,並且無法繼承自其他任何類型。類別可以繼承自任何類別,但不能繼承自 System.ValueType

  • 結構不可繼承;類別為 。

  • 結構永遠不會終止,因此 Common Language Runtime(CLR)永遠不會在任何結構上呼叫 Finalize 方法。類別會由垃圾收集行程(GC)終止,當垃圾收集器偵測到沒有任何作用中參考時,會在類別上呼叫 Finalize 方法。

  • 結構體不需要建構子;類別則需要。

  • 結構只有在採用參數時,才能有非共享建構函式;類別的建構函式則可以有參數或沒有參數。

每個結構都有不含參數的隱含公用建構函式。 這個建構函式會將所有結構的數據元素初始化為其預設值。 您無法重新定義此行為。

實例和變數

因為結構是實值型別,因此每個結構變數都會永久系結至個別結構實例。 但是類別是參考型別,而物件變數可以在不同的時間參考各種類別實例。 此區別會以下列方式影響結構和類別的使用方式:

  • 初始化。 結構變數隱含地包含其元素的初始化,使用結構的不帶參數的建構函式。 因此, Dim s As struct1 相當於 Dim s As struct1 = New struct1()

  • 指派變數。 當您將某個結構變數指派給另一個結構變數,或將結構實例傳遞至程式自變數時,所有變數專案的目前值都會複製到新的結構。 當您將某個物件變數指派給另一個物件變數,或將物件變數傳遞至程式時,只會複製參考指標。

  • 指派 Nothing。 您可以將 Nothing 值指派給結構變數,但實例會繼續與變數相關聯。 您仍然可以呼叫其方法並存取其數據元素,不過變數元素會由指派重新初始化。

    相反地,如果您將物件變數設定為 Nothing,您會將其與任何類別實例解除關聯,而且在將另一個實例指派給變數之前,您無法透過變數存取任何成員。

  • 多個實例。 物件變數可以有不同的類別實例在不同時間指派給它,而數個物件變數可以同時參考相同的類別實例。 當您透過指向相同實例的另一個變數存取時,對類別成員的值所做的變更會影響這些成員。

    不過,結構元素會在自己的 實例內隔離。 其值的變更不會反映在任何其他結構變數中,即使是在相同宣告的其他實例中也一樣 Structure

  • 平等。 兩個結構的相等測試必須與逐元素測試一起執行。 您可以使用 Equals 方法比較兩個物件變數。 Equals 指出兩個變數是否指向相同的實例。

另請參閱