2011-12-22 10 views
7

Sto codificando un'applicazione VB.NET che si occupa molto di un tipo di raccolta. Vedere il codice di seguito:Qual è l'equivalente o una soluzione alternativa per un typedef in VB.NET?

Dim sub_Collection As System.Collections.Generic.Dictionary(Of String, 
          System.Collections.ObjectModel.Collection) 

Devo digitare la linea sopra per così tante volte. Se ho cambiato il tipo di raccolta, quindi devo apportare la modifica per tutte le istanze. Quindi se c'è un modo per usare "un equivalente typedef", allora posso sbarazzarmi di tutti questi problemi. Ho provato con le importazioni, ma è solo per spazi dei nomi e non può essere utilizzato per le classi. Ogni mano sarà molto apprezzata.

Nota: sto utilizzando VB 2008, Windows XP. Il tipo di applicazione è Windows Form (VB).

MODIFICA: Ho effettuato alcuni tentativi in ​​base alla seguente risposta di code_gray.

Questo è il primo tentativo.

Imports dictionary_WaterBill = System.Collections.Generic.Dictionary(Of String, System.Collections.ObjectModel.Collection(Of WaterBill)) 
Structure WaterBill 
... 
... 
End Structure 

ho avuto l'errore come

Error:Type 'WaterBill' is not defined. 

Questo è provare 2.

Structure WaterBill 
... 
... 
End Structure 
Imports dictionary_WaterBill = System.Collections.Generic.Dictionary(Of String,  
System.Collections.ObjectModel.Collection(Of WaterBill)) 

ho ottenuto l'errore come

Error:'Imports' statements must precede any declarations. 

Chiunque è benvenuto a gettare una luce riguardo questo argomento.

+0

Una delle cose che veramente odio di .Net è l'assenza di typedef. Scusate, ma penso che la vostra risposta sia "No" ... :( – paulsm4

+1

Scrivo da anni codice .NET e non ho mai avuto bisogno o voluto un typedef. Uno di noi deve fare qualcosa di sbagliato –

+0

Uno di noi le cose che mi piacciono veramente di Pascal sono il suo sistema di tipi: i typedef di tipo C/C++ sono pallidi in confronto. Suppongo che la risposta di Net sia "avvolgere in una classe" .Sebbene sì, questo fa schifo Le "collezioni" di Prabhakaran sono eccellenti esempio perché: IMHO ... PS: solo perché hai usato le viti con un martello per anni non significa che non trarrai vantaggio da un cacciavite :) – paulsm4

risposta

2

La soluzione semplice è semplicemente aggiungere uno Imports statement per i due spazi dei nomi che si stanno utilizzando. Sin dall'inizio, questo elimina la metà dei tuoi identificatori di tipo lunghi.

Nella parte superiore del file di codice, inserire le righe:

Imports System.Collections 
Imports System.Collections.Generic 
Imports System.Collections.ObjectModel 

E poi il tuo dichiarazione possono essere modificati a:

Dim sub_Collection As Dictionary(Of String, Collection) 

io consiglierei questo approccio perché utilizza ancora il nomi standard, che mantengono il tuo codice di facile lettura per altri programmatori.


L'alternativa è quella di utilizzare un Imports dichiarazione per dichiarare un alias. Qualcosa di simile:

Imports GenericDict = System.Collections.Generic.Dictionary(Of String, 
          System.Collections.ObjectModel.Collection) 

E allora si potrebbe cambiare la vostra dichiarazione:

Dim sub_Collection As GenericDict 


*** A proposito, al fine di ottenere uno di questi campioni per compilare, dovrete per specificare un tipo per Collection, ad esempio Collection(Of String).

+1

Il problema principale è il dizionario. Richiede la dichiarazione dei parametri. Devi dire esplicitamente il dizionario (Of String, System.Collections.etc.Collections). Devo anche dichiarare dizionari per altre raccolte. – prabhakaran

+0

D: Inoltre, "Imports MyDictionary = System.Collections.Generic.Dictionary (Of String, System.Collections.ObjectModel.Collection)" non deve essere ripetuto in tutti i moduli sorgente che volevano utilizzare l'alias? – paulsm4

+0

@ paulsm4 - Sì. –

2

Creare una classe ereditata senza contenuti:

Class WaterBillDictionary 
    Inherits System.Collections.Generic.Dictionary(Of String, System.Collections.ObjectModel.Collection(Of WaterBill)) 
End Class 

Structure WaterBill 
    ... 
End Structure 

Se si desidera un costruttore particolare si dovrà scrivere un wrapper che accetta i parametri e li passa al costruttore di base. Per esempio:

Public Sub New() 
    MyBase.New() 
End Sub 

Public Sub New(capacity As Integer) 
    MyBase.New(capacity) 
End Sub 

Se hai bisogno di cambiare il nome del WaterBillDictionary, è possibile utilizzare la funzione di ridenominazione di Visual Studio per modificare automaticamente il nome in tutta la soluzione.

+2

Vale la pena notare che mentre la classe ereditata sarà sostituibile per la base, la classe base non sarà né sostituibile * né calcinabile * alla classe derivata. – supercat

+0

ovviamente - questo è il concetto fondamentale di ereditarietà .. in qualche modo inutile dire – specializt

Problemi correlati