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





Any others that should be done immediately?
Как правило, по возможности заменяйте любое упоминание IEnumerable на IEnumerable<T>. Миграции может значительно помочь переключение всего пространства имен, т.е. отключение import от System.Collections в каждом файле и вместо этого импорт System.Collections.Generic.
Кроме того, поищите упоминания о object и / или использовании бокса в вашем коде и подумайте, уместно ли это по-прежнему или его следует заменить дженериками.
Как Jalf напомнил мне в комментариях, еще одним важным изменением является переход на общую версию IComparable, где это применимо.
Безусловно, предпочтение отдается универсальным коллекциям из-за их выразительности. При переходе с неуниверсальных коллекций следует иметь в виду, что иногда поведение может отличаться от ожидаемого. Например, использование индексатора в 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, запустите и протестируйте. А затем, когда потребуются новые функции, которые позволили бы вам хорошо использовать дженерики, реализуйте эти функции как универсальные.
Об этом я подумал, читая вопрос. Не меняйте ничего, если вам не нужно. Когда вы перейдете к написанию нового кода, начните использовать дженерики или, если вы вносите изменения в существующий код, переключитесь на дженерики. Но не пытайтесь изменить все сразу.
См. Новую книгу Билла Вагнера Более эффективный C#. Есть много отличных советов по переходу на дженерики.
Я бы не рекомендовал использовать List<T> вместо CollectionBase. Вместо этого Collection<T> дает вам сопоставимые переопределения.
если у вас еще нет набора модульных тестов с отличным покрытием кода, не меняй ничего без надобности
в противном случае вы просто напрашиваетесь на неприятности, не говоря уже о том, чтобы придумывать хлопоты ...
И аналогично, IComparable с IComparable <T>