Подтвердить что ты не робот

CollectionBase vs generics

Я переношу приложение с .NET 1.1 на .NET 2.0. Должен ли я удалить все виды использования CollectionBase? Если да, то какова наилучшая стратегия миграции?

4b9b3361

Ответ 1

Да, лучшие классы, на которые нужно обратить внимание, находятся в System.Collections.Generic.
Обычно я использую List.

Есть два подхода, которые вы можете использовать:

А

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

В

public class MyItemCollection : List<MyItem>
{
}

public class MyClass
{
  public MyItemCollection Items;
}

Эти два подхода отличаются очень незначительно, и вам нужно использовать метод (B), если вы планируете расширить функциональность List.

Здесь ссылка с дополнительной информацией:
http://msdn.microsoft.com/en-us/library/6sh2ey19(VS.80).aspx

Что касается уже реализованных классов, вы можете удалить все функции, указанные в интерфейсе IList. например.

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

Это можно удалить, потому что List уже реализует для вас безопасную функцию добавления типа.

См. эту ссылку для получения дополнительной информации:
http://msdn.microsoft.com/en-us/library/3wcytfd1(VS.80).aspx

Ответ 2

Как правило, List<T> выполняет большую часть того, что вы обычно хотите. Если вы хотите настроить поведение, вы должны наследовать от Collection<T> - у этого есть методы virtual, чтобы вы могли настраивать поведение при добавлении/удалении/обновлении и т.д. Вы не можете сделать это с помощью List<T>, поскольку нет (uesful ) virtual.

Ответ 3

Я предпочитаю подход Mark Ingrams A), возможно, с базовым классом, который вы пишете сами.

Есть еще одна проблема с переносом на дженерики; преобразование имеет тенденцию иметь определенный вирусный эффект. Вы не сможете остановиться, пока не пройдете весь путь. Если вы THUUGHT вы собираетесь потратить пару часов на выполнение НЕКОТОРЫХ дженериков, вы часто будете тратить несколько дней на ВСЕ ДРУГИЕ дженерики.

Вы можете/должны избегать этого, предоставляя вашим новым операторам перегрузку классов в/из списка

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
}

Это действительно просто остановки. Вы можете использовать "найти способы их использования" на любом последующем этапе, чтобы определить, какие места не были полностью преобразованы. Когда все способы использования удаляются, вы можете удалить приведения.

Я вообще предпочитаю сделать бросок из MyClass в List явным (это то, как вы не хотите идти), а другое неявное.

Лучшим подходом было бы, как правило, начать в верхней части ваших слоев, рядом с уровнем представления и работать вниз. (Это противоположно тому, что вы могли бы подумать. Если вы сделаете актерский состав из MyClass в список неявным, не имеет значения, с какого конца вы начинаете)