Переходим к дженерикам

Я переношу приложение winforms с версии 1.1 на версию 2.0. какие основные вещи я должен немедленно изменить из-за дженериков. Вот что у меня есть на данный момент:

  1. Замените все хэш-таблицы общими словарями
  2. Замените все массивы списком <>
  3. Замените все производные классы CollectionBase на: List <>

Есть ли другие, которые следует сделать немедленно?

спасибо, ак

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
310
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Any others that should be done immediately?

Как правило, по возможности заменяйте любое упоминание IEnumerable на IEnumerable<T>. Миграции может значительно помочь переключение всего пространства имен, т.е. отключение import от System.Collections в каждом файле и вместо этого импорт System.Collections.Generic.

Кроме того, поищите упоминания о object и / или использовании бокса в вашем коде и подумайте, уместно ли это по-прежнему или его следует заменить дженериками.

Как Jalf напомнил мне в комментариях, еще одним важным изменением является переход на общую версию IComparable, где это применимо.

И аналогично, IComparable с IComparable <T>

jalf 29.11.2008 19:47

Безусловно, предпочтение отдается универсальным коллекциям из-за их выразительности. При переходе с неуниверсальных коллекций следует иметь в виду, что иногда поведение может отличаться от ожидаемого. Например, использование индексатора в Hashtable и Dictionary будет действовать по-разному для значений, которых нет. Hashtable вернет null, а Dictionary выдаст.

Hashtable ht = new Hashtable();
ht.Add(1, "one");
string s1 = ht[1;  // s1 = "one"
string s2 = ht[2]; // s2=null

var dic = new Dictionary<int, string>();
dic.Add(1, "one");
string s1 = dic[1];  // s1 = "one"
string s2 = dic[2];  // throws KeyNotFoundException

Обычный способ справиться с этим - использовать следующую технику:

string s = null;
if (dic.TryGetValue(k, out s))
{
    // if we're here, k was found in the dictionary
}

Это будет отображаться только во время выполнения, поэтому об этом стоит знать заранее.

Не думаю, что что-то нужно делать немедленно! Код 1.1 работает, верно? В чем состоит экономическая выгода для оптового перехода на дженерики? Скомпилируйте приложение до версии 2.0, запустите и протестируйте. А затем, когда потребуются новые функции, которые позволили бы вам хорошо использовать дженерики, реализуйте эти функции как универсальные.

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

Kibbee 29.11.2008 20:43

См. Новую книгу Билла Вагнера Более эффективный C#. Есть много отличных советов по переходу на дженерики.

Я бы не рекомендовал использовать List<T> вместо CollectionBase. Вместо этого Collection<T> дает вам сопоставимые переопределения.

если у вас еще нет набора модульных тестов с отличным покрытием кода, не меняй ничего без надобности

в противном случае вы просто напрашиваетесь на неприятности, не говоря уже о том, чтобы придумывать хлопоты ...

Другие вопросы по теме