2010-08-31 4 views
24

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

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

+8

См [этот вопрос] (http://stackoverflow.com/questions/77632/what-is-cool-about -generics-почему потребительные их). – 2010-08-31 06:48:45

+0

См .: http://www.csharp-station.com/Tutorials/Lesson20.aspx – kenorb

ответ

50

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

Что делать, если вы не можете использовать дженерики? Вы можете использовать класс 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<string>, это просто невозможно:

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 
+3

Хороший ответ. Легко следить. – RKh

+0

+1 за возможность дать хороший, чистый и некоммерческий пример. Отлично сработано. – Subby

+0

теперь это то, что мы называем основным объяснением, с удивительными примерами, имеющими фрагмент кода в реальном времени. Отлично. +1 – Kings

0

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

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

5

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

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

// 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! 

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

+0

Хотел бы я сказать, что сказал Унмеш: «Дублирование - это корень всего зла». – Jay

3

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

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

Дженерики поддерживаются в 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

+2

Есть много корней всего зла, как преждевременная оптимизация и даже преждевременное обобщение;) –

Смежные вопросы