物件是程式碼和資料的組合,可以視為一個單位。 物件可以是應用程式的片段,例如控件或表單。 整個應用程式也可以是物件。
當您在 Visual Basic 中建立應用程式時,會持續使用 物件。 您可以使用 Visual Basic 所提供的物件,例如控件、表單和資料存取物件。 您也可以在 Visual Basic 應用程式中使用來自其他應用程式的物件。 您甚至可以建立自己的物件,併為其定義其他屬性和方法。 物件就像程式預製建置組塊一樣,可讓您撰寫一段程序代碼,並反覆重複使用。
本主題會詳細討論物件。
對象和類別
Visual Basic 中的每個物件都是由 類別定義。 類別描述 物件的變數、屬性、程式和事件。 物件是類別的實例;一旦定義了類別,就可以根據需要創建多個物件。
若要了解物件與其類別之間的關聯性,請想到餅乾模具和餅乾。 餅乾切割機是類別。 它會定義每個 Cookie 的特性,例如大小和形狀。 類別是用來建立物件。 物件是 Cookie。
您必須先建立物件,才能存取其成員,只有 Shared 成員可在沒有類別物件的情況下存取。
從類別建立物件
判斷您要從哪個類別建立物件,或定義您自己的類別。 例如:
Public Class Customer Public Property AccountNumber As Integer End Class撰寫 Dim 語句 來建立變數,以便指派類別實例。 變數應該是所需類別的類型。
Dim nextCustomer As Customer新增 New Operator 關鍵詞,以將變數初始化為 類別的新實例。
Dim nextCustomer As New Customer您現在可以透過物件變數存取 類別的成員。
nextCustomer.AccountNumber = lastAccountNumber + 1
備註
您應盡可能地將變數宣告為您想要指派給它的類別類型。 這稱為 早期系結。 如果您在編譯時期不知道類別類型,您可以將變數宣告為 Object 數據類型,以叫用晚期系結。 不過,晚期系結可能會讓效能變慢,並限制對運行時間對象成員的存取。 如需詳細資訊,請參閱 物件變數宣告。
多個執行個體
從類別新建立的物件通常彼此一致。 不過,一旦它們以個別物件的形式存在,其變數和屬性就可以與其他實例分開變更。 例如,如果您將三個複選框新增至窗體,則每個複選框物件都是 類別的 CheckBox 實例。 個別 CheckBox 物件會共享 類別所定義的一組通用特性和功能(屬性、變數、程式和事件)。 不過,每個都有它自己的名稱,可以個別啟用和停用,而且可以放在表單上的不同位置。
對象成員
對象是應用程式的專案,代表類別的 實例 。 欄位、屬性、方法和事件是 物件的建置組塊,並構成其 成員。
成員存取
您可以依序指定物件變數的名稱、句號 (.) 和成員的名稱,以存取對象的成員。 下列範例會設定 Text 物件的屬性 Label 。
warningLabel.Text = "Data not saved"
IntelliSense 成員清單
IntelliSense 會在您叫用類別的 List Members 選項時列出類別的成員,例如當您將句點 (.) 輸入為成員存取運算符時。 如果您在宣告為該類別之實例的變數名稱之後輸入句點,IntelliSense 會列出所有實例成員,而不列出任何共享成員。 如果您在類別名稱本身之後輸入句點,IntelliSense 會列出所有共享成員,而不會列出實例成員。 如需詳細資訊,請參閱使用 IntelliSense。
欄位和屬性
欄位 和 屬性 代表儲存在物件中的資訊。 您可以使用指派語句來擷取和設定其值,就像在程式中擷取和設定局部變數一樣。 下列範例會擷取Width屬性,並設定ForeColor物件的Label屬性。
Dim warningWidth As Integer = warningLabel.Width
warningLabel.ForeColor = System.Drawing.Color.Red
請注意,欄位也稱為 成員變數。
在下列情況下使用屬性程序:
您需要控制設定或擷取值的時機和方式。
屬性具有一組定義完善的值,需要驗證。
設定值會導致物件狀態的某些可感知變更,例如
IsVisible屬性。設定 屬性會導致其他內部變數或其他屬性的值變更。
必須先執行一組步驟,才能設定或擷取 屬性。
在下列情況下使用欄位:
值是自我驗證類型。 例如,如果指派給
True變數的值不是False或Boolean,就會發生錯誤或自動資料轉換。數據類型所支援範圍中的任何值都是有效的。 這在許多
Single或Double類型的屬性中都是如此。屬性是
String數據類型,而且字串的大小或值沒有條件約束。如需詳細資訊,請參閱 屬性程式。
小提示
務必將非常量欄位保持為私用。 當您想要將其設為公開時,請改用屬性。
方法
「方法」是物件可執行的動作。 例如,Add 是 ComboBox 物件的方法,可將新的條目加入下拉式方塊。
Dim safetyTimer As New System.Windows.Forms.Timer
safetyTimer.Start()
請注意,方法只是一個由物件公開的程序。
如需詳細資訊,請參閱 程式。
事件
事件是由物件識別的動作,例如點擊滑鼠或按下按鍵,並且您可以撰寫程式碼來回應。 事件可能會因為使用者動作或程式代碼而發生,或者可能是由系統所造成。 用於發出事件訊號的程式碼稱為引發事件,而回應事件的程式碼則稱為處理事件。
您也可以開發自己的自定義事件,以由對象引發,並由其他對象處理。 如需詳細資訊,請參閱 事件。
實例成員和共享成員
當您從類別建立物件時,結果就是該類別的實例。 未以 Shared 關鍵詞宣告的成員是 實例成員,其完全屬於該特定實例。 一個實例中的實例成員與相同類別之另一個實例中的相同成員無關。 例如,實例成員變數在不同的實例中可以有不同的值。
使用 Shared 關鍵詞宣告的成員是 共享成員,屬於整個類別,而不是任何特定實例。 不論您建立的類別實例數目,或即使您未建立實例,共享成員只存在一次。 例如,共用成員變數只有一個值,可供所有可存取 類別的程序代碼使用。
存取非共享成員
請確定物件已從其類別建立,並指派給物件變數。
Dim secondForm As New System.Windows.Forms.Form在存取成員的語句中,首先是物件變數名稱,其後使用 成員存取運算元 (
.),接著是成員名稱。secondForm.Show()
存取共享成員
請遵循類別名稱搭配 成員存取運算子(
.),接著使用成員名稱。 您應該一律透過類別名稱直接存取Shared對象的成員。Console.WriteLine("This computer is called " & Environment.MachineName)如果您已經從 類別建立物件,您也可以透過物件的變數存取
Shared成員。
類別和模組之間的差異
類別和模組之間的主要差異在於,類別可以被實例化為物件,而標準模組則無法。 因為標準模組的數據只有一個複本,所以當程式的一個部分變更標準模組中的公用變數時,如果程式的任何其他部分接著讀取該變數,就會取得相同的值。 相反地,每個具現化對象的對象數據會個別存在。 另一個差異在於,不同於標準模組,類別可以實作介面。 如果類別標示為 MustInherit 修飾詞,則無法直接具現化。 不過,它仍然與模組不同,因為它可以繼承,而模組無法繼承。
備註
Shared當修飾詞套用至類別成員時,它會與類別本身相關聯,而不是類別的特定實例。 成員是使用類別名稱直接存取的,其方式與存取模組成員的方式相同。
類別和模組也會針對其成員使用不同的範圍。 類別內定義的成員範圍在 類別的特定實例內,而且只存在於 物件的存留期。 若要從類別外部存取類別成員,您必須使用 Object 格式的完整名稱。成員。
另一方面,模組內宣告的成員預設為可公開存取,而且可由任何可存取模組的程式代碼存取。 這表示標準模組中的變數實際上是全域變數,因為它們可從您專案中的任何位置看見,而且它們存在於程式生命週期中。
重複使用類別和物件
物件可讓您宣告變數和程式一次,然後視需要重複使用它們。 例如,如果您想要將拼字檢查程式新增至應用程式,您可以定義所有變數和支援函式,以提供拼字檢查功能。 如果您將拼字檢查程式建立為類別,則可以藉由新增已編譯元件的參考,在其他應用程式中重複使用它。 更棒的是,您可以使用其他人已經開發的拼字檢查類別來節省自己的一些工作。
.NET 提供許多可供使用的元件範例。 下列範例使用命名空間中的TimeZone類別的System類。 TimeZone 提供成員,可讓您擷取目前計算機系統時區的相關信息。
Public Sub ExamineTimeZone()
Dim tz As System.TimeZone = System.TimeZone.CurrentTimeZone
Dim s As String = "Current time zone is "
s &= CStr(tz.GetUtcOffset(Now).Hours) & " hours and "
s &= CStr(tz.GetUtcOffset(Now).Minutes) & " minutes "
s &= "different from UTC (coordinated universal time)"
s &= vbCrLf & "and is currently "
If tz.IsDaylightSavingTime(Now) = False Then s &= "not "
s &= "on ""summer time""."
Console.WriteLine(s)
End Sub
在上述範例中,第一個 Dim 語句宣告TimeZone類型的物件變數,並將TimeZone屬性所傳回的CurrentTimeZone物件指派給它。
對象之間的關聯性
物件可以透過數種方式彼此關聯。 關聯性的主要類型為 階層和 內含。
階層式關聯性
當類別衍生自更基本類別時,據說它們具有 階層式關聯性。 類別階層在描述屬於更一般類別子類型的專案時很有用。
在下列範例中,假設您想要定義一種特殊的Button,其作用就像一般Button,並且公開一個方法,可以反轉前景和背景色彩。
定義衍生自現有類別的類別
使用 Class 語句 來定義類別,以便從中建立您需要的物件。
Public Class ReversibleButton請確保在類別中的最後一行程式碼後面有一個
End Class語句。 根據預設,整合開發環境 (IDE) 會在您輸入End Class語句時自動產生Class。請緊接著
Class語句後加入Inherits 語句。 指定新類別衍生的來源類別。Inherits System.Windows.Forms.Button您的新類別會繼承基類所定義的所有成員。
新增衍生類別所公開之其他成員的程序代碼。 例如,您可以新增
ReverseColors方法,而衍生類別看起來可能如下所示:Public Class ReversibleButton Inherits System.Windows.Forms.Button Public Sub ReverseColors() Dim saveColor As System.Drawing.Color = Me.BackColor Me.BackColor = Me.ForeColor Me.ForeColor = saveColor End Sub End Class如果您從
ReversibleButton類別建立 物件,它可以存取 類別的所有成員 Button ,以及ReverseColors方法以及您在 中ReversibleButton定義的任何其他新成員。
衍生類別會繼承其所依據類別的成員,讓您在類別階層進行時新增複雜度。 如需詳細資訊,請參閱 繼承基本概念。
編譯程式碼
請確定編譯程式可以存取您想要從中衍生新類別的類別。 這可能表示完整限定其名稱,如上述範例所示,或在 Imports 語句中識別其命名空間(.NET 命名空間和類型)。 如果類別位於不同的專案中,您可能需要新增對該專案的參考。 如需詳細資訊,請參閱 管理專案中的參考。
內含項目關聯性
另一種對象間的關係是包含關係。 容器物件會以邏輯方式封裝其他物件。 例如, OperatingSystem 物件會以邏輯方式包含 Version 物件,它會透過其 屬性傳回該 Version 物件。 請注意,容器對象實際上不包含任何其他物件。
收藏品
一種特定的物件內含類型由集合表示。 集合是可以列舉的類似物件群組。 Visual Basic 支援 For Each...Next 語句 中的特定語法,可讓您逐一遍歷集合的項目。 此外,集合通常可讓您使用 Item[] 根據其索引擷取元素,或藉由將元素與唯一字串關聯來檢索它們。 集合比陣列更容易使用,因為它們可讓您新增或移除專案而不使用索引。 由於它們容易使用,集合通常用來儲存表單和控件。
相關主題
逐步解說:定義類別
提供如何建立類別的逐步描述。
多載屬性和方法
多載屬性和方法
繼承基本概念
涵蓋繼承修飾詞、覆寫方法和屬性、MyClass 和 MyBase。
物件存留期:物件建立和終結的方式
討論建立和銷毀類別實例。
匿名類型
描述如何建立和使用匿名型別,這可讓您建立物件,而不需撰寫數據類型的類別定義。
物件初始化表達式:具名和匿名類型
討論物件初始化表達式,這些初始化表達式是用來使用單一表達式來建立具名和匿名型別的實例。
如何:推斷匿名類型宣告中的屬性名稱和類型
說明如何在匿名型別宣告中推斷屬性名稱和類型。 提供成功與失敗推斷的範例。