2008-11-22 8 views
17

Estoy migrando una aplicación de .NET 1.1 a .NET 2.0. ¿Debo eliminar todos los usos de CollectionBase? De ser así, ¿cuál es la mejor estrategia para la migración?CollectionBase vs generic

Respuesta

22

Sí, las mejores clases para mirar están en System.Collections.Generic.
Normalmente uso List.

Hay dos enfoques que puede utilizar:

Un

public class MyClass 
{ 
    public List<MyItem> Items; 
} 

B

public class MyItemCollection : List<MyItem> 
{ 
} 

public class MyClass 
{ 
    public MyItemCollection Items; 
} 

Los dos enfoques sólo se diferencian muy poco y sólo necesitan utilizar método (B) si planea ampliar la funcionalidad de List.

Aquí hay un enlace con más información:
http://msdn.microsoft.com/en-us/library/6sh2ey19(VS.80).aspx

Con respecto a las clases que ya haya implementado, puede quitar todas las funciones que se especifican en la interfaz IList. p.ej.

public int Add(InstrumentTradeDataRow instTrade) { return List.Add(instTrade); } 

Esto se puede eliminar porque List ya implementa una función de tipo seguro Agregar para usted.

ver este enlace para más información:
http://msdn.microsoft.com/en-us/library/3wcytfd1(VS.80).aspx

+0

me puede dar un ejemplo. . – leora

+1

Hecho. ¿Algo más que te gustaría ver? –

+0

qué hago con el código existente como esto: \t int público Add (InstrumentTradeDataRow instTrade) \t \t { \t \t \t retorno List.Add (instTrade); \t \t} – leora

1

prefiero Marcos Ingram A) enfoque, posiblemente con una clase base se escribe a sí mismo.

Hay otro problema con la migración a los genéricos; la conversión tiene una tendencia a tener un cierto efecto viral. Puede que le resulte imposible detenerse antes de terminar. Si pensabas que pasarías un par de horas haciendo ALGUNOS medicamentos genéricos, a menudo te encontrarás pasando varios días haciendo TODOS los medicamentos genéricos.

Puede/debe evitar esto dando a sus nuevas clases sobrecargas de operadores a/de la lista

public static implicit operator MyClass(List m) 
{ 
    // code to convert from m to MyClass 
} 

public static explicit operator List(MyClass m) 
{ 
    // code to convert from MyClass list 
} 

Estos son realmente sólo paliativos. Puede usar "encontrar usos" en estos en cualquier etapa posterior para determinar qué lugares no se han convertido completamente. Cuando se eliminan todos los usos, puede eliminar los moldes.

Por lo general, perfero hacer explícito el reparto de MyClass a List (esta es la forma en que no desea ir) y el otro implícito.

El mejor enfoque normalmente sería comenzar en la parte superior de las capas, cerca de la capa de presentación y trabajar hacia abajo. (Esto es lo opuesto a lo que podría pensar. Si realiza el reparto de MyClass a List implícito, no importa qué final comience)

16

Generalmente, List<T> hace la mayor parte de lo que normalmente desea. Si desea personalizar el comportamiento, debe heredar de Collection<T> - esto tiene virtual métodos para que pueda ajustar el comportamiento al agregar/eliminar/actualizar, etc. No puede hacer esto con List<T> ya que no hay métodos (uesus) virtual.

+0

Desafortunadamente 'Collection .Add' no es virtual, aunque definitivamente debería ser. – abatishchev

+4

@abatishchev - no, pero 'InsertItem' * es * (que maneja' Add' y 'Insert'), al igual que' SetItem' (que maneja la reasignación) –

+0

Sí, tienes razón, me apresuré un poco, ¡Gracias! – abatishchev