This appendix summarizes generic classes and methods. The final section in this appendix describes items that you cannot make generic.
To define a generic class, make a class declaration as usual. After the class name, add one or more type names for data types surrounded by brackets. The following code defines a generic BinaryNode
class with the generic type highlighted in bold.
public class BinaryNode<T>
{
public T Value;
public BinaryNode<T> LeftChild, RightChild;
}
The class’s declaration includes one type parameter T
. The class’s code declares a Value
field of type T
. It also uses the type to declare the LeftChild
and RightChild
fields of type BinaryNode<T>
.
You can add constraints on the generic types, as in the following code.
public class SortedBinaryNode<T> where T : IComparable<T>
{
...
}
The code where T : IComparable<T>
indicates that the generic type T
must implement the interface IComparable<T>
.
A generic type’s where
clause can include one or more of the elements shown in the following table.
Element | Meaning |
struct | The type must be a value type. |
class | The type must be a reference type. |
new() | The type must have a parameterless constructor. |
«baseclass» | The type must inherit from baseclass. |
«interface» | The type must implement interface. |
«typeparameter» | The type must inherit from typeparameter. |
The following code defines the StrangeGeneric
class where type T1
must implement IComparable<T1>
and must provide a parameterless constructor, type T3
must inherit from the Control
class, and type T2
must inherit from type T3
.
public class StrangeGeneric<T1, T2, T3>
where T1 : IComparable<T1>, new()
where T3 : Control
where T2 : T3
{
}
You can also give a class (generic or otherwise) a generic method. Just as a generic class is not tied to a particular data type, the parameters of a generic method are not tied to a specific data type.
To make a generic method, include type parameters similar to those you would use for a generic class. The following code defines a generic Switch
method inside the static Switcher
class.
public static class Switcher
{
// Switch two values.
public static void Switch<T>(ref T value1, ref T value2)
{
T temp = value1;
value1 = value2;
value2 = temp;
}
}
3.21.46.78