Share via


具名和匿名型別比較 (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)

參考

Key (Visual Basic)

概念

匿名型別 (Visual Basic)

區域型別推斷 (Visual Basic)