Почему некоторые классы Платформы.NET не используют Дженериков, когда они могли?

Пример:

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

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

5
задан Adam Robinson 10 May 2010 в 23:50
поделиться

4 ответа

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

Например,

ArrayList foo = new ArrayList();

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

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

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

10
ответ дан 18 December 2019 в 06:11
поделиться

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

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

var query = from item in arrayList.OfType<int>() select item;
2
ответ дан 18 December 2019 в 06:11
поделиться

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

2
ответ дан 18 December 2019 в 06:11
поделиться

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

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

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

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

12
ответ дан 18 December 2019 в 06:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: