Переходим к дженерикам. - PullRequest
       9

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

6 голосов
/ 29 ноября 2008

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

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

Любые другие, которые должны быть сделаны немедленно?

Thks, ак

Ответы [ 6 ]

8 голосов
/ 29 ноября 2008

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

7 голосов
/ 29 ноября 2008

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

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

.

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

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

3 голосов
/ 29 ноября 2008

Универсальные коллекции, безусловно, предпочтительнее из-за их выразительности. При переходе от неуниверсальных коллекций следует помнить одну вещь: иногда поведение может отличаться от ожидаемого. Например, использование индексатора в Hashtable vs. Dictionary будет действовать по-разному для значений, которых нет. Hashtable вернет ноль, в то время как 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
}

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

2 голосов
/ 29 ноября 2008

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

0 голосов
/ 30 ноября 2008

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

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

0 голосов
/ 30 ноября 2008

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

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