具名和匿名型別比較 (Visual Basic)
用來宣告匿名型別執行個體 (Instance) 的格式,類似於使用物件初始設定式來宣告具名型別執行個體時的格式。 不過,這兩種格式所產生的結果有很大的不同。
宣告
在下列範例中,product1 是匿名型別的執行個體,而 product2 則是 Product 類別 (Class) 的執行個體。 這兩種宣告都在其宣告中使用初始設定清單。 兩種宣告之間唯一的語法差異是,product1 的 New 後面未指定資料型別, 這樣就使 product1 成為匿名型別。
' Variable product1 is an instance of an anonymous type.
Dim product1 = New With {.Name = "paperclips", .Price = 1.29}
product1 變數已強型別 (Strongly Typed) 為匿名型別的執行個體。 編譯器 (Compiler) 會根據您在宣告中指定的屬性來定義型別。 編譯器會使用區域型別推斷 (Visual Basic),從您提供的初始值中判斷屬性的資料型別。 在這個範例中,匿名型別包含 Name 和 Price 屬性,這兩個屬性的型別分別推斷為 String 和 Double。
注意事項 |
---|
在上一個範例中,這些屬性都未被指定為索引鍵屬性, 因此,您無法用它們來判斷相同型別的兩個執行個體是否相等,或執行個體的雜湊程式碼值為何。 不過不像索引鍵屬性是唯讀的,您可以變更這些屬性的值。 如需索引鍵屬性的詳細資訊,請參閱匿名型別 (Visual Basic)。 |
在下列範例中,product2 已強型別為 Product 類別的執行個體。 Name 和 Price 都必須是 Product 類別的成員,而且它們的型別必須與宣告中提供的值相容。
' Variable product2 is an instance of Product.
Dim product2 = New Product With {.Name = "paperclips", .Price = 1.29}
如需詳細資訊,請參閱物件初始設定式:具名和匿名型別 (Visual Basic)。
不同處
下列清單比較這兩種宣告的其他設定:
區域型別推斷會將 product1 判斷為匿名型別的執行個體,並將 product2 判斷為 Product 類別的執行個體。 這兩個宣告中都沒有 As 子句,不過可以選擇對 product2 使用 As 子句。
因為匿名型別沒有指定名稱,所以不能使用 As 子句宣告 product1。 其型別必須由推斷得出。 這會將匿名型別的使用方式限制在區域變數。
因為 product2 是具名型別 Product 的執行個體,所以可以不使用型別推斷,而使用 As 子句來進行宣告。
Dim product2a As New Product With {.Name = "paperclips", .Price = 1.29}
如果在 Product 中定義了適當的建構函式 (Constructor),則可以不使用物件初始設定式就宣告和初始化 product2。
Dim product2b As New Product("paperclips", 1.29)
下列系列的陳述式具有相同的效果。
Dim product2c As New Product product2c.Name = "paperclips" product2c.Price = 1.29
product1 沒有類似的宣告,因為其屬性是在初始設定式清單中進行命名和定義。
因為 product1、product2 和它們的屬性都是強型別,所以您可以用 IntelliSense 來巡覽使用這些物件的程式碼。
警告
匿名型別的名稱是由編譯器產生,而且每次編譯時產生的名稱都不同。 您的程式碼不應該使用或固定參考匿名型別的名稱,因為一旦重新編譯專案,這個名稱就會不同。
請參閱
工作
HOW TO:宣告匿名型別的執行個體 (Visual Basic)
HOW TO:在匿名型別宣告中推斷屬性名稱和型別 (Visual Basic)