Почему некоторые классы .NET Framework не используют Generics, когда они могли бы? - PullRequest
5 голосов
/ 11 мая 2010

Пример:

System.Web.Security.MembershipCollection реализует IEnumerable, а не IEnumberable<T>. Почему он не реализует последнее, когда кажется, что было бы лучше (например, использовать LINQ)?

Или не обязательно лучше?

Ответы [ 4 ]

12 голосов
/ 11 мая 2010

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

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

Обмен : API-интерфейсы, использующие некоторые передовые Особенности Generics могут быть слишком трудно использовать для некоторых разработчиков. Понятие дженериков не широко понял, в некоторых случаях синтаксис могут создавать проблемы, и как любой большой Новая функция, Generics может представлять значительная кривая обучения для некоторых разработчики начального уровня.

Да, цитата за 2004 год, но некоторые, если не большинство .Net API, которые вы используете сегодня, вышли в 2005 году, поэтому цитата на самом деле очень актуальна.

10 голосов
/ 11 мая 2010

Вы можете использовать LINQ с любым IEnumerable, используя функцию Cast<T>() или функцию OfType<T>(). Если вы уверены, что IEnumerable содержит только объекты определенного типа, то Cast<T>() будет немного быстрее.

Например,

ArrayList foo = new ArrayList();

foo.Add("bar");
foo.Add("baz");

var bar = foo.Cast<string>().Select(s => s.ToUpper());

Существует много существующих классов (например, ArrayList), которые существовали до появления обобщений в .NET, поэтому они все еще не являются универсальными.

2 голосов
/ 11 мая 2010

Имейте в виду, что многие типы BCL, которые мы используем, относятся ко времени, предшествующему генерикам, появившимся в 2.0. Однако вы по-прежнему можете использовать LINQ для многих из них, вам просто нужно проделать небольшую дополнительную работу.

ArrayList arrayList = new ArrayList();
arrayList.Add(1);
arrayList.Add(2);

var query = from item in arrayList.OfType<int>() select item;
2 голосов
/ 11 мая 2010

Эти классы часто датируются тем, что в дженериках были. Дженерики. Многие такие классы имеют дженерики, но не все. Есть и обходные пути. например с помощью linq любые неуниверсальные коллекции могут быть созданы с использованием методов расширения .Cast () и .OfType (). linqy и generic.

...