Documente Academic
Documente Profesional
Documente Cultură
namespace GenericApplication
{
public class MyGenericArray<T>
{
private T[] array;
public MyGenericArray(int size)
{
array = new T[size + 1];
}
class Tester
{
static void Main(string[] args)
{
//setting values
for (int c = 0; c < 5; c++)
{
intArray.setItem(c, c*5);
}
Console.WriteLine();
//setting values
for (int c = 0; c < 5; c++)
{
charArray.setItem(c, (char)(c+97));
}
Console.ReadKey();
}
}
}
When the above code is compiled and executed, it produces the following result:
0 5 10 15 20
abcde
You can create generic collection classes. The .NET Framework class library contains several new
generic collection classes in the System.Collections.Generic namespace. You may use these
generic collection classes instead of the collection classes in the System.Collections namespace.
You can create your own generic interfaces, classes, methods, events, and delegates.
You may create generic classes constrained to enable access to methods on particular data types.
You may get information on the types used in a generic data type at run-time by means of
reflection.
Generic Methods
In the previous example, we have used a generic class; we can declare a generic method with a type
parameter. The following program illustrates the concept:
using System;
using System.Collections.Generic;
namespace GenericMethodAppl
{
class Program
{
static void Swap<T>(ref T lhs, ref T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
static void Main(string[] args)
{
int a, b;
char c, d;
a = 10;
b = 20;
c = 'I';
d = 'V';
//display values before swap:
Console.WriteLine("Int values before calling swap:");
Console.WriteLine("a = {0}, b = {1}", a, b);
Console.WriteLine("Char values before calling swap:");
Console.WriteLine("c = {0}, d = {1}", c, d);
//call swap
Swap<int>(ref a, ref b);
Swap<char>(ref c, ref d);
When the above code is compiled and executed, it produces the following result:
a = 10, b = 20
c = I, d = V
a = 20, b = 10
c = V, d = I
Generic Classes
The Generic class can be defined by putting the <T> sign after the class name. It
isn't mandatory to put the "T" word in the Generic type definition. You can use any
word in the TestClass<> class declaration.
public class TestClass<T> { }
The System.Collection.Generic namespace also defines a number of classes that
implement many of these key interfaces. The following table describes the core class
types of this namespace.
Non-Generics
Members
Description
Collection<T>
Dictionary<TKey,
TValue>
List<T>
Queue<T>
Stack<T>
array of delegates:
using System;
public class MathOperations
{
public static double MultiplyByTwo(double value)
{
return value * 2;
}
public static double Square(double value)
{
return value * value;
}
using System;
delegate double DoubleOp(double x);
class Application
{
static void Main()
{
DoubleOp[] operations =
{
MathOperations.MultiplyByTwo,
MathOperations.Square
};
for (int i = 0; i < operations.Length; i++)
{
Console.WriteLine("Using operations[{0}]:", i);
ProcessAndDisplayNumber(operations[i], 2.0);
ProcessAndDisplayNumber(operations[i], 7.94);
ProcessAndDisplayNumber(operations[i], 1.414);
Console.WriteLine();
}
}
static void ProcessAndDisplayNumber(DoubleOp action, double value)
{
double result = action(value);
Console.WriteLine(
"Value is {0}, result of operation is {1}", value, result);
}
}
Output:
Hide Copy Code
Using operations[0]:
Value is 2, result of operation is 4
Value is 7.94, result of operation is 15.88
Value is 1.414, result of operation is 2.828
Using operations[1]:
Value is 2, result of operation is 4
Value is 7.94, result of operation is 63.0436
Value is 1.414, result of operation is 1.999396