Понимание обобщений C # намного лучше

Я рассмотрел пример кода с использованием обобщений C #. Почему и когда я должен их использовать?

Все примеры были сложными. Мне нужен простой, понятный пример, который поможет мне начать с обобщений C #.

26
задан Peter Mortensen 6 September 2010 в 18:30
поделиться

4 ответа

Очень простым примером является общий класс List. Он может содержать ряд объектов любого типа. Например, вы можете объявить список строк (новый список<строка>()) или список животных (новый список<животное>()), поскольку он является общим. .

Что, если бы вы не могли использовать дженерики? Вы можете использовать класс ArrayList, но недостатком является то, что он содержит тип object.Поэтому, когда вы перебираете список, вам нужно привести каждый элемент к его правильному типу (либо string, либо Animal), что является дополнительным кодом и снижает производительность. Кроме того, поскольку ArrayList содержит объекты, он не является типобезопасным. Вы все еще можете добавить Animal в ArrayList строк:

ArrayList arrayList = new ArrayList();
arrayList.Add(new Animal());
arrayList.Add("");

Таким образом, при повторении ArrayList вам придется проверять тип, чтобы убедиться, что экземпляр относится к определенному типу. , что приводит к плохому коду:

foreach (object o in arrayList)
{
  if(o is Animal)
    ((Animal)o).Speak();
}

С универсальным List это просто невозможно:

List<string> stringList = new List<String>();
stringList.Add("Hello");
stringList.Add("Second String");
stringList.Add(new Animal()); // error! Animal cannot be cast to a string
53
ответ дан 28 November 2019 в 06:40
поделиться

Подводя итог другим ответам с некоторым акцентом:

1) дженерики позволяют вам писать «общий» код (т. е. он будет работать для нескольких типов). Если у вас есть «общее» поведение, которое вы хотите написать, которое вам нужно вести для разных типов данных, вам нужно написать этот код только один раз. Пример List является отличным примером, вам могут понадобиться списки, возможно, клиентов, продуктов, заказов, поставщиков... все с использованием одного и того же кода, созданного для каждого типа

//  snippet
List<Customer> customers = new List<Customer>();
Customer thisCustomer = new Customer();
customers.Add(thisCustomer);

List<Order> orders = new List<Order>();
Order thatOrder = new Order();
orders.Add(thatOrder);

//  etc.

2) поразительно, дженерики по-прежнему обеспечивают безопасность типов! Поэтому, если вы попробуете это, вы правильно получите ошибку:

//  continued for snippet above
Order anotherOrder = new Order();
customers.Add(anotherOrder);    //  FAIL!

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

5
ответ дан 28 November 2019 в 06:40
поделиться

Дублирование — корень всех зол. Один случай дублирования кода возникает, когда вам нужно выполнить одну и ту же операцию с разными типами данных. Обобщения позволяют вам избежать этого, позволяя вам кодировать «обобщенный» тип, а затем заменять его конкретными типами.

Другим решением этой проблемы является использование переменных типа «System.Object», которым может быть присвоен объект любого типа.Этот метод включает в себя операции упаковки и распаковки между типами значений и ссылочными типами, которые влияют на производительность. Кроме того, приведение типов не позволяет коду быть чистым.

Универсальные шаблоны поддерживаются в MSIL и CLR, что делает их очень эффективными.

Вы должны прочитать эти статьи о дженериках —

http://msdn.microsoft.com/en-us/library/512aeb7t(VS.80).aspx

http://msdn.microsoft.com /en-us/library/ms379564(VS.80).aspx#csharp_generics_topic1

3
ответ дан 28 November 2019 в 06:40
поделиться

Короче говоря, вам писать классы, которые работают с объектами любого типа, но без необходимости приводить данные к Object. Это дает преимущества в производительности, но также делает ваш код более читабельным, удобным для сопровождения и менее подверженным ошибкам.

По возможности всегда следует использовать дженерики, а не классы стиля .NET 1.1.

0
ответ дан 28 November 2019 в 06:40
поделиться
Другие вопросы по тегам:

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