Generics are the most
powerful feature of C# 2.0. Generics allow us to define type-safe data
structures. Generic collection types also generally perform better than the
corresponding non generic collection types.
A generic collection is strongly typed (type safe), meaning that we can store only one type of data into the collection. This ensures there are no type mismatches at runtime. An additional benefit of generic collection is that performance is better because we do not need to converted them to actual object.
A generic collection is strongly typed (type safe), meaning that we can store only one type of data into the collection. This ensures there are no type mismatches at runtime. An additional benefit of generic collection is that performance is better because we do not need to converted them to actual object.
Generics provides the
type safe code with re-usability like as algorithm. In algorithms such as
sorting, searching, comparing etc. you don’t specify what data type(s) the
algorithm operates on. The algorithm can be operates with any types of data. In
the same way Generics operate, you can provide different data type to Generics.
For example, a sorting algorithm can operates on integer type, decimal type,
string type, DateTime type etc.
In this article, I will
demonstrate the advantage of Generics over Collections. Following are the main
advantage of Generics.
Code Re-usability with Generics
Suppose, you required to sort the integer and floating type
numbers, then let's see how to do in collections and generics.
How to
do it using Collections
//Overloaded sort methods
private int[] Sort(int[] inputArray)
{
//Sort array
//and return sorted
array
return inputArray;
}
private float[] Sort(float[]
inputArray)
{
//Sort array
//and return sorted
array
return inputArray;
}
How to
do it using Generics
private T[] Sort(T[]
inputArray
{
//Sort arra
//and return sorted
arra
return inputArray;
}
Here, T is short for Type and can be replaced with the Type
defined in the C# language at runtime. So once we have this method, we can call
it with different data types as follows and can see the beauty of Generics. In
this way Generics provide code re-usability.
Now if you thinking you can make fool to the compiler by passing
an integer array while it is asking for a float, you are wrong. Compiler will
shows the error at compile time like as:
Type Safety with Generics
Suppose, you want to make a list of students, then let's see how
to do in collections and generics.
How to
do it using Collections
In collections we can use ArrayList to store a list of Student
objects like as:
class Student
{
public int RollNo{get; set;}
public string Name{get; set;}
}
//List of students
ArrayList studentList = new ArrayList();
Student objStudent = new Student();
objStudent.Name = "Rajat";
objStudent.RollNo = 1;
studentList.Add(objStudent);
objStudent
= new Student();
objStudent.Name = "Sam";
objStudent.RollNo = 2;
studentList.Add(objStudent)
foreach
(Object s in studentList)
{
//Type-casting. If s is anything other than a student
Student
currentStudent = (Student)s;
Console.WriteLine("Roll # "
+ currentStudent.RollNo + " " + currentStudent.Name);
}
Problem
with Collections
Suppose by mistake you have added a string value to ArrayList
like as
studentList.Add("Generics");
//Fooling the compiler
Since ArrayList is a loosely typed collection and it never
ensure compile-time type checking. Hence above statement will compile without
error but it will throw an InvalidCastException at run time when you try to
cast it to Student Type.
How to
do it using Generics
In generics we can use generic List to store a list of Student
objects like as:
List<Student> lstStudents = new List<Student>();
Student objStudent = new Student();
objStudent.Name = "Rajat";
objStudent.RollNo = 1;
lstStudents.Add(objStudent);
objStudent
= new Student();
objStudent.Name = "Sam";
objStudent.RollNo = 2;
lstStudents.Add(objStudent);
//Looping through the list of students
foreach
(Student currentSt in lstStudents)
{
//no need to type cast since compiler already knows that
everything inside
//this list is a Student
Console.WriteLine("Roll # "
+ currentSt.RollNo + " " + currentSt.Name);
}
Advantage
with Generics
In case of collections you can make fool to compiler but in case
of generics you can't make fool to compiler as shown below. Hence Generics
provide Type Safety.
Cleaner Code with Generics
Since compiler enforces type safety with Generics. Hence
fetching data from Generics doesn't required type casting which means your code
is clean and easier to write and maintain.
Better Performance with Generics
As you have seen in above example, at the time of fetching the
data from the ArrayList collection we need to do type casting which cause
performance degrades. But at the time of fetching the data from the generic
List we don't required to do type casting. In this way Generics provide better
performance than collections.
No comments:
Post a Comment