Sunteți pe pagina 1din 3

C# Generics

First of all, let's take an example where generics can be of great help.

1.
2.
3.

1.
2.

Suppose you are writing a class for Stack with methods Push() and Pop(). You have to implement this
class in such a way that it works for any data type. Now you will have two options if generic was not there to
help you.
Define classes for each data types. You can achieve the solution using this approach. However there
are many disadvantages of this approach:
You are writing redundant code.
If you need to support a new data type, then you need to add a new class for that.
You are discouraging code reusability.
Defined class for data type as object. This is somewhat better than the first approach. However, it
has its own disadvantages.
Performance would be degraded because of boxing and un-boxing.
TypeSafety is lost. Your solution will not be type safe.
Generic solves all the above problems. It:
allows you to define type-safe data structures, without providing actual data types.
allows you to write a class or method that can work with any data type.

Generic Constraints
As you know, you can use any data type with generic classes. Like you can use

int, float, double

data

types with generic Stack class. However, sometimes we need to restrict the data types which can be used
with particular generic class or methods. We can achieve this using generic constraints.

Generic Constraints are Categorized as Below


Derivation constraints Restrict the generic type parameter to be derivative of specified interface or
class.
Hide Copy Code

public class LinkedList<K,T> where K : IComparable


// K data type must implement IComparable
Hide Copy Code

public class LinkedList<K,T> where K : IComparable<K>


// K data type must implement IComparable<T>
Hide Copy Code

public class LinkedList<K,T> : IEnumerable<T> where K : IComparable<K>


// Derive from IEnumerable<T> and K data type must implement IComparable<K>
Hide Copy Code

public class LinkedList<K,T> where K : IComparable<K>,IConvertible


// K data type must implement IComparable<K> and IConvertible
Hide Copy Code

public class LinkedList where K : IComparable,IConvertible


// K data type must implement both IComparable and IConvertible
Constructor Constraints Restricts the generic type parameter to define default constructor.

N. While instantiating
object of data type Node, you want to instantiate the object of data type N inside Node class. In this
Suppose you have a generic class

Node

and this class has a property of data type

N. However, if the default constructor is


not defined for class N, it will throw exception while instantiating object of N.
case, the compiler will try to invoke default constructor of the class
You can restrict the generic data type to have default constructor.
Hide Copy Code

class Node<K,T> where T : new() // T must have default constructor


{
public K Key;
public T Item;
public Node<K,T> NextNode;
public Node()
{
Key
= default(K);
Item
= new T();
NextNode = null;
}
}
public class LinkedList<K,T> where K : IComparable<K>,new()
// K must implement Icomparable<K> and have default constructor
Reference/Value Type Constraint
Sometimes, you need to define constraint so that the generic data type is value type or reference type.
You can constrain a generic type parameter to be a value type (such as an
custom structure using the

struct

int, a bool, and enum) or any

constraint:
Hide Copy Code

public class MyClass where T : struct


Similarly, you can constrain a generic type parameter to be a reference type (a class) using the class
constraint:
Hide Copy Code

public class MyClass where T : class

Inheritance using generics


Hide Copy Code

public class SubClass<T> : BaseClass<T>


// SubClass and BaseClass will have generic type T
Hide Copy Code

public class SubClass<T> : BaseClass<T> where T : ISomeInterface


// SubClass and BaseClass will have generic type T which implements ISomeInterface
Hide Copy Code

public class SubClass<T> : BaseClass<T> where T : new()


// SubClass and BaseClass will have generic type T which must have default constructor

Generic Methods
Hide Copy Code

public class SubClass<T> : BaseClass<T>


{

public override T SomeMethod(T t) {}


// BaseClass and SubClass will have generic type T and SomeMethod() will take parameter T and
return object of type T
}

S-ar putea să vă placă și