Condividi tramite


Confronto tra tipi denominati e tipi anonimi

Aggiornamento: novembre 2007

Il formato utilizzato per dichiarare un'istanza di un tipo anonimo è simile al formato che si utilizza quando si dichiara un'istanza di un tipo denominato tramite un inizializzatore di oggetto. Tuttavia, vi sono importanti differenze nel risultato.

Dichiarazioni

Nell'esempio riportato di seguito product1 è un'istanza di un tipo anonimo mentre product2 è un'istanza della classe Product. Entrambe le dichiarazioni utilizzano un elenco di inizializzazione nelle dichiarazioni. L'unica differenza di sintassi tra le due dichiarazioni è che non viene specificato alcun tipo di dati dopo New per product1. In tal modo si crea un tipo anonimo.

' Variable product1 is an instance of an anonymous type.
Dim product1 = New With {.Name = "paperclips", .Price = 1.29}

La variabile product1 è fortemente tipizzata come un'istanza di un tipo anonimo. Il compilatore definisce il tipo in funzione delle proprietà specificate nella dichiarazione. Il compilatore utilizza Inferenza dei tipi locali per determinare i tipi di dati delle proprietà dal valore iniziale fornito. In questo esempio, il tipo anonimo contiene le proprietà Name e Pricee i relativi tipi vengono dedotti come String e Double, rispettivamente.

Nota:

Nell'esempio precedente nessuna delle proprietà viene specificata come proprietà chiave. Pertanto, le proprietà non hanno alcun ruolo nel determinare se due istanze dello stesso tipo sono uguali o quale sia il valore del codice hash dell'istanza. Tuttavia i valori delle proprietà possono venire modificati mentre i valori delle proprietà chiave sono di sola lettura. Per ulteriori informazioni sulle proprietà chiave, vedere Tipi anonimi.

Nell'esempio riportato di seguito product2 è fortemente tipizzata come un'istanza della classe Product. Sia Name che Price, devono essere membri della classe Product e i relativi tipi devono essere compatibili con i valori forniti nella dichiarazione.

' Variable product2 is an instance of Product.
Dim product2 = New Product With {.Name = "paperclips", .Price = 1.29}

Per ulteriori informazioni, vedere Inizializzatori di oggetto: tipi denominati e tipi anonimi.

Differenze

Nell'elenco seguente vengono confrontati gli altri aspetti delle due dichiarazioni:

  • L'inferenza del tipo di variabile locale determina che product1 è un'istanza di un tipo anonimo e che product2 è un'istanza della classe Product. Non esiste una clausola As in nessuna dichiarazione, anche se per product2 la clausola As è facoltativa.

    • Poiché i tipi anonimi non hanno nomi specificati, non è possibile utilizzare una clausola As per dichiarare product1. Il tipo deve essere dedotto. Questo limita l'utilizzo di tipi anonimi alle variabili locali.

    • Poiché product2 è un'istanza di un tipo denominato, Product, è possibile dichiararlo senza utilizzare inferenza dei tipi, tramite una clausola As.

      Dim product2a As New Product With {.Name = "paperclips", .Price = 1.29}
      
  • Se in Product viene definito un costruttore appropriato, è possibile dichiarare e inizializzare product2 senza utilizzare un inizializzatore di oggetto.

    Dim product2b As New Product("paperclips", 1.29)
    

    In alternativa, la seguente serie di istruzioni ha lo stesso effetto.

    Dim product2c As New Product
    product2c.Name = "paperclips"
    product2c.Price = 1.29
    

    Non esistono dichiarazioni simili per product1 perché le relative proprietà sono denominate e definite nell'elenco di inizializzatori stesso.

  • Poiché product1, product2e le relative proprietà sono tutti fortemente tipizzati, è possibile utilizzare IntelliSense per spostarsi nel codice che utilizza entrambi gli oggetti.

    Attenzione:

    Il nome del tipo anonimo viene generato dal compilatore e può variare da una compilazione a un'altra. Il codice non deve utilizzare o non deve basarsi sul nome di un tipo anonimo perché il nome potrebbe cambiare quando un progetto viene ricompilato.

Vedere anche

Attività

Procedura: dichiarare un'istanza di un tipo anonimo

Procedura: dedurre nomi di proprietà e tipi nelle dichiarazioni di tipo anonimo

Concetti

Tipi anonimi

Inferenza dei tipi locali

Riferimenti

Key (Visual Basic)