2011-12-22 13 views
7

Estoy codificando una aplicación VB.NET que trata en gran medida con un tipo de colección. Vea el siguiente código:¿Cuál es el equivalente o la solución para un typedef en VB.NET?

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

Tengo que escribir la línea de arriba tantas veces. Si cambié el tipo de colección, entonces tengo que hacer el cambio para todas las instancias. Entonces, si hay una forma de usar "un equivalente de typedef", entonces puedo deshacerme de todos estos problemas. Intenté con importaciones, pero es solo para espacios de nombres y no puede usarse para clases. Cualquier mano amiga será muy apreciada.

Nota: Estoy usando VB 2008, Windows XP. El tipo de aplicación es formularios de Windows (VB).

EDIT: Hice algunos intentos basados ​​en la respuesta a continuación de code_gray.

Este es el primer intento.

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

que tiene el error como

Error:Type 'WaterBill' is not defined. 

Esto se trate 2.

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

Tengo el error como

Error:'Imports' statements must precede any declarations. 

Cualquiera es bienvenido a arrojar una luz en este tema.

+0

Una de las cosas que realmente odio de .Net es la ausencia de typedefs. Lo siento, pero creo que su respuesta es "No" ... :( – paulsm4

+1

He estado escribiendo el código .NET durante años y nunca he necesitado o querido un typedef. Uno de nosotros debe estar haciendo algo mal. –

+0

Uno de las cosas que realmente me gustan de Pascal es su sistema de tipos. Los tipos de C/C++ son pálidos en comparación. Supongo que la respuesta de .Net es "envolverlo en una clase". Si es así, eso apesta. Las "colecciones" de Prabhakaran son excelentes. ejemplo por qué. IMHO ... PD: simplemente porque ha estado usando tornillos con un martillo durante años no significa que no se beneficiaría de un destornillador :) – paulsm4

Respuesta

2

La solución simple es simplemente agregar un Imports statement para los dos espacios de nombres que está utilizando. Desde el principio, eso elimina la mitad de los identificadores de tipo largo.

En la parte superior del archivo de código, colocar las líneas:

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

Y entonces su declaración puede ser cambiado a:

Dim sub_Collection As Dictionary(Of String, Collection) 

Me gustaría recomendar este enfoque, ya que todavía utiliza la nombres estándar, lo que hace que su código sea fácil de leer para otros programadores.


La alternativa es utilizar una sentencia Imports para declarar un alias. Algo así como:

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

Y entonces se podría cambiar su declaración a:

Dim sub_Collection As GenericDict 


*** Por cierto, con el fin de obtener cualquiera de estas muestras para compilar, tendrá para especificar un tipo para Collection, como Collection(Of String).

+1

El principal problema es el diccionario. Exige la declaración de parámetros. Tienes que decir explícitamente como diccionario (Of String, System.Collections.etc.Collections). También tengo que declarar dictioneries para algunas otras colecciones. – prabhakaran

+0

P: Además, ¿no se debe repetir "Imports MyDictionary = System.Collections.Generic.Dictionary (Of String, System.Collections.ObjectModel.Collection) en cada módulo de origen que desea utilizar el alias? – paulsm4

+0

@ paulsm4 - Sí. –

2

Crear una clase heredada sin contenido:

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

Structure WaterBill 
    ... 
End Structure 

Si desea un constructor particular, usted tendrá que escribir un envoltorio que acepte los parámetros y los pasa al constructor base. Por ejemplo:

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

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

Si alguna vez tiene que cambiar el nombre de WaterBillDictionary, puede utilizar la función de cambio de nombre de Visual Studio para cambiar automáticamente el nombre en toda la solución.

+2

Vale la pena señalar que, si bien la clase heredada será sustituible por la base, la clase base no será sustituible * ni convertible * en la clase derivada. – supercat

+0

por supuesto, ese es el concepto central de la herencia ... no hace falta decirlo – specializt

Cuestiones relacionadas