Introduction
Generics (in the "System.Collections.Generic" namespace) were introduced in the 2.0 version of .Net and are now widely used. The concept is similar to C++ templates but different in implementation and capabilities. It is a very important feature of .Net programming, allowing a class and methods such as lists, hash tables, queues and so on to be defined with a type T as a parameter.
The type of generic parameter is specified only at the time of declaration. Using this, the programmer will improve the performance of an application. In addition to performance, generics provide type-safety and higher quality code because you get to reuse data processing algorithms without duplicating type-specific code.
Generics are also known as Parametric polymorphism.
Example
You can write a single class of generic type and we can use that generic class just by applying the appropriate datatype. For example I create a class MyClass<T> and we can use it like MyClass<int>, MyClaas<String>, MyClass<double> or MyClass< AnyClass> without the need for casting and unboxing. For examle, consider a scenario where we need a different kind of queue, like a queue of int, string so we can create a generic type queue and based on our needs we can use that.
Advantages of using generic
ArrayList dynamically resizes. As elements are added, it grows in capacity to accommodate them. It is most often used in older C# programs. It stores a collection of elements of type object. Casting is needed. ArrayList is present in the System.Collections namespace.
Generics provide a solution for the limitation of an ArrayList collection in the Common Language Runtime. We will see the limitations of non-generic collection classes, using the ArrayList collection class.
using System;
using System.Collections;
public class ArrayListExample
{
static void ArrayListMethod()
{
// Creates and initializes a new ArrayList.
ArrayList listExample = new ArrayList();
listExample.Add("One");
listExample.Add("2");
listExample.Add(3);
}
}
In the ArrayList Collection, any reference or value type data added to an ArrayList must be typecast to "System.Object". If the items are value types then they must be boxed when they are added to the list and unboxed when they are retrieved. The casting, boxing, unboxing operation reduce the performance.
In a generic List<T> collection, using the "System.Collections.Generic" namespace, we will see the same operation.
using System;
using System.Collections.Generic;
public class GenericList
{
public static void GenericListMethod()
{
List<int> genericList = new List<int>();
// No boxing, no casting:
genericList.Add(12);
genericList.Add(13);
genericList.Add(14);
genericList.Add(15);
}
}
As compared to ArrayList it would be safer and faster, because in ArrayList we can enter anything since it accepts the value of object type. Here we can only enter type specific data like int, string or double.
- Code Reusability in generics (Advantage)
Generics provide type-safe code with re-usability.
Example
Suppose you need to sort the integer and floating type numbers, let's see how to do it in collections and generics.
The following shows how to do it in a collection:
using System.Collections;
public class GenericArrayList
{
public static void ListSorting()
{
int[] intArray = { 8, 10, 2, 6, 3 };
// Sort your int array
Array.Sort(intArray);
foreach (var i in intArray)
{
Console.WriteLine(i);
}
// Sort it the other way
string[] strArray = { "A", "D", "C", "E", "B" };
Array.Sort(strArray);
foreach (var i in strArray)
{
Console.WriteLine(i);
}
Console.ReadLine();
}
}
Renjith JPosted May 16, 2019, 6:45 PM
Perfectly explained bro...
Vivek TripathiPosted May 18, 2015, 11:58 AM
well explained