資料型別實作 (Visual Basic)
Visual Basic 中的每個基礎資料型別,都受到 System 命名空間中的結構或類別所支援。 編譯器使用每個資料型別關鍵字做為基礎結構或類別的別名。 例如,利用保留字 Byte 宣告變數,與利用完整結構名稱 System.Byte 宣告變數並無不同。
在 Visual Basic 中,資料型別是根據其分類來實作。 根據特定型別的變數是否儲存自己專屬的資料或資料指標,就能將 Visual Basic 資料型別加以分類。 如果它會儲存自己專屬的資料,則為「實值型別」(Value Type)。如果它會儲存記憶體中別處資料的指標,則為「參考型別」(Reference Type)。
實值型別
若資料型別是在其本身的記憶體配置中存放資料,資料型別就屬於「實值型別」(Value Type)。 實值型別包含下列項目:
所有的數字資料型別
Boolean、Char 和 Date
所有結構 (即使其成員也屬於參考型別的結構)
列舉型別 (Enumeration),因為其基礎型別一定是 SByte、Short、Integer、Long、Byte、UShort、UInteger 或 ULong
每個結構都是實值型別,即使它具有參考型別成員。 基於這個原因,像 Char 和 Integer 這類的實值型別是由 .NET Framework 結構所實作。
您可以使用保留的關鍵字 (例如 Decimal) 宣告實值型別。 您也可以使用 New 關鍵字來初始化實值型別。 若型別具有包含參數的建構函式 (Constructor) 則特別適用。 Decimal(Int32, Int32, Int32, Boolean, Byte) 建構函式是這種範例中的一個,它會依據提供的組件建置新的 Decimal 值。
參考型別
「參考型別」(Reference Type) 包含存放在其他記憶體配置中資料的指標。 參考型別包含下列項目:
String
所有陣列 (即使其元素也屬於實值型別的陣列)
類別型別,例如 Form
委派
類別是「參考型別」(Reference Type)。 基於這個原因,像 Object 和 String 這類的參考型別是由 .NET Framework 類別支援。 請注意,每個陣列都是參考型別,即使其成員屬於實值型別亦同。
由於每個參考型別都分別代表著一個基礎 .NET Framework 類別,因此在初始化時您必須使用 New 運算子 (Visual Basic) 關鍵字。 下列陳述式會進行陣列初始化。
Dim totals() As Single = New Single(8) {}
.NET Framework 中也可使用其他型別
Common Language Runtime (CLR) 也支援 Visual Basic 不提供的結構和類別。 例如,System.Guid 結構提供全域唯一識別項 (GUID),而 System.TimeZone 類別則支援時區。 您可以使用這些型別宣告變數和常數,並可以存取 .NET Framework 實作這些型別的方法。 然而對於未提供的型別,Visual Basic 不支援相關作業或型別轉換。
不是型別的元素
下列程式設計項目不能限定型別,因為您無法指定任何一個型別做為宣告項目的資料型別:
命名空間
模組
事件
屬性和程序
變數、常數和欄位
使用物件資料型別
您可以將參考型別或實值型別指派至 Object 資料型別的變數。 Object 變數存放的永遠是資料的指標,而非資料本身。 但是如果您將實值型別指派給 Object 變數,則此變數看起來就像是存放其本身的資料一般。 如需詳細資訊,請參閱 Object 資料型別。
將 Object 變數傳遞到 Microsoft.VisualBasic 命名空間 Information 類別的 IsReference 方法中,即可發現該變數是做為參考型別或實值型別。 如果 Object 變數的內容代表參考型別,則 Information.IsReference 會傳回 True。
資料型別具有成員
由於受到 .NET Framework 結構和類別的支援,所以 Visual Basic 資料型別具有「成員」(Member)。 這些成員包括有建構函式、方法、屬性及欄位。 您可以在變數上存取成員 (不包括建構函式),方式則與您存取物件上的方法及屬性相同。
下列範例使用 System.DateTime 結構的 Year、Month 和 Day 屬性以及 DaysInMonth 方法,以判斷當月還有多少天。
Dim current As Date = Now
Dim daysRemaining As Integer
daysRemaining = Date.DaysInMonth(current.Year, current.Month) - current.Day
請注意,您必須使用型別的名稱 (Date) 或宣告為該型別的變數名稱 (current),以限定資料型別成員的參考。
資料型別成員的範例
下列程式碼原型 (Prototype) 將說明資料型別中一些有用的方法、屬性和欄位。
<Char>.IsDigit() ' Returns True if character is a numeric digit.
<Char>.IsLower() ' Returns True if character is a lowercase letter.
<Date>.IsLeapYear() ' Returns True if current year is a leap year.
<Date>.ToUniversalTime() ' Returns local date/time converted to UTC.
<Double>.IsInfinity() ' Returns True if contents represent infinity.
<Double>.IsNaN() ' Returns True if contents are not a number (0/0).
<Long>.MaxValue ' Constant representing largest positive Int64 value.
<Object>.GetType() ' Returns Type object representing type of <Object>.
<Object>.GetType().GetTypeCode() ' Returns type code of <Object>.
<String>.Chars(<index>) ' Character at position <index> of <String>.
<String>.Length ' Number of characters currently in <String>.
所有數字型別 (Numeric Type),包括 Byte 和 Char,會公開 MaxValue 和 MinValue 公用欄位,這在處理這些型別時很有用。
不保證資料型別成員的等價
.NET Framework 也提供數個資料型別方法,看起來似乎是 Visual Basic 函式和關鍵字的對等用法。 然而,Visual Basic 並非一定會使用 .NET Framework 方法來達成轉換或其他作業,因此結果未必會相同。
例如,ToSingle 方法對於 Decimal 運算式所執行的動作類型,與 CSng 關鍵字所執行的相同。 但是,CSng 並不保證會使用 System.dataType.ToSingle,因此在邊際或界限條件下結果也未必相同。
一般而言,您應該要使用 Visual Basic 程式設計項目,因為它們較容易使用,並可以讓程式碼更易於閱讀。 在某些情況下,可能會需要一些由 .NET Framework 方法提供的其他功能。 如需這部分的相關範例,請參閱疑難排解資料型別 (Visual Basic)中的<Mod 運算子沒有傳回精確的結果>一節。
相關章節
詞彙 |
定義 |
介紹 Visual Basic 資料型別並說明用法。 |
|
列出 Visual Basic 提供的基礎資料型別。 |
|
說明型別轉換,也就是將值從一種資料型別變更為另一種型別的過程。 |
|
說明結構,這是以 Structure 關鍵字宣告的使用者定義型別。 |
|
說明如何使用資料型別讓執行更迅速。 |
|
說明 Object 資料型別,此資料型別可用來參考任何資料型別的資料。 |