Почему C # и VB имеют Generics? Какую пользу они дают? Generics, FTW - PullRequest
6 голосов
/ 19 сентября 2008

Из Википедия :

Общее программирование - это стиль компьютерное программирование, в котором алгоритмы написаны с точки зрения типы, которые будут определены позже затем создается при необходимости конкретные типы, предоставляемые в качестве параметров и был впервые Ада, появился в 1983 году. Такой подход позволяет писать общие функции или типы, которые отличаются только набором типы, на которых они работают при использовании, таким образом уменьшая дублирование.

Обобщения предоставляют возможность определять типы, которые будут указаны позже. Вам не нужно приводить предметы к типу, чтобы использовать их, потому что они уже набраны.

Почему в C # и VB есть Generics? Какую пользу они дают? Какие преимущества вы найдете, используя их?

Какие еще языки имеют дженерики?

Ответы [ 15 ]

6 голосов
/ 19 сентября 2008

C # и VB имеют дженерики, чтобы воспользоваться преимуществами поддержки дженериков в базовом CLR (или наоборот?). Они позволяют вам писать код на языке со статической типизацией, который может применяться к нескольким типам типов, без переписывания кода для каждого типа, для которого вы их используете (среда выполнения сделает это для вас) или иным образом с использованием System.Object и приведение повсюду (как мы делали с ArrayList).

Вы прочитали статью ?

Эти языки также имеют дженерики:

  • C ++ (через шаблоны )
  • Ада (через шаблоны )
  • Eiffel
  • D (через шаблоны )
  • Haskell
  • Java
5 голосов
/ 19 сентября 2008

Лично я думаю, что они позволяют сэкономить много времени. Я все еще использую .NET Framework 1.1, и каждый раз, когда вам нужна конкретная коллекция, вам нужно создавать строго типизированную коллекцию, реализуя CollectionBase. С Generics вам просто нужно объявить свою коллекцию вот так List<MyObject> и все готово.

3 голосов
/ 24 сентября 2008

Рассмотрим эти сигнатуры методов:

//Old and busted
public abstract class Enum
{
  public static object Parse(Type enumType, string value);
}
//To call it:
MyEnum x = (MyEnum) Enum.Parse(typeof(MyEnum), someString);

//New and groovy
public abstract class Enum
{
  public static T Parse<T>(string value);
}

//To call it:
MyEnum x = Enum.Parse<MyEnum>(someString);

Look ma: нет манипуляций с типом во время выполнения.

2 голосов
/ 19 сентября 2008

Вероятно, наиболее распространенное использование для них - это строго типизированные списки ArrayLists. В .NET 1.1 вам придется либо приводить все от объекта к желаемому типу, либо использовать что-то вроде CodeSmith для создания строго типизированного ArrayList.

Кроме того, они помогают уменьшить бокс . Опять же, в .NET 1.x, если вы попытаетесь использовать ArrayList с типом значения, вы в конечном итоге будете упаковывать и распаковывать объекты повсеместно. Обобщения позволяют избежать этого, позволяя вам определить тип, будь то ссылка или значение.

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

2 голосов
/ 19 сентября 2008

С MSDN :

Дженерики предоставляют решение для ограничение в более ранних версиях общеязыковая среда выполнения и C # язык, на котором обобщение достигается путем приведения типов и из универсального базового типа Объект. Создав универсальный класс, вы можете создать коллекцию, которая является типобезопасной во время компиляции.

Прочитайте остальную часть этой статьи, чтобы увидеть некоторые примеры того, как Generics может улучшить читабельность и производительность вашего кода.

1 голос
/ 24 сентября 2008

Самое большое преимущество универсальных типов по сравнению с неуниверсальными типами в C # (не Java, Java - это отдельная история) состоит в том, что они намного быстрее. JIT генерирует лучший машинный код, который он может придумать для данного типа. List<int> на самом деле является списком целых, а не целочисленных объектов, обертывающих int. Это делает универсальные типы удивительно быстрыми, а также безопасными для типов, что может помочь вам обнаружить огромное количество ошибок во время компиляции:)

1 голос
/ 20 сентября 2008

Они повышают производительность для коллекций, использующих типы значений, так как не требуется никакой упаковки / распаковки. Они намного удобнее в использовании, поскольку вам не нужно приводить объект (например, с помощью ArrayList) к нужному типу, а также они помогают обеспечить безопасность типов.

1 голос
/ 20 сентября 2008

Обобщения в .net, такие как методы наследования и расширения, позволяют уменьшить дублирование кода. Позвольте мне объяснить с помощью рефакторинга.

Если все классы с общим предком имеют общий метод, поместите общий метод в общего предка классов (наследование).

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

Если некоторые несколько методов или классов имеют один и тот же код, который отличается только типами, с которыми выполняются действия (особенно если детали типа не относятся к работе метода), соберите эти методы или классы в общий тип. 1007 *

1 голос
/ 19 сентября 2008

Обобщения основаны на концепции шаблонов в c ++, если вы с ними знакомы.

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

После этого списку можно назначить любой тип по вашему выбору int, string и даже пользовательские типы, которые назначаются типу при создании списка. Но вы сможете использовать список операций добавить удалить и т. Д.

Вы действительно можете сэкономить много времени на программировании, привыкнув к дженерикам. И вам не нужно боксировать и распаковывать между типами.

У Java также есть дженерики. Они называются символами подстановки.

1 голос
/ 19 сентября 2008

Обобщения в .NET отлично подходят для коллекций объектов. Вы можете определить свой тип объекта так, как хотите, и можете иметь, скажем, List без написания какого-либо кода для этого и иметь доступ ко всем эффективным функциям универсальной коллекции .NET List, в то же время будучи безопасными для T. отличный материал.

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