泛型允许延迟编程元素的类或方法的数据类型的规范,直到它在程序中实际使用时确定。 换句话说,泛型允许编写一个可以使用任何数据类型的类或方法。
为类或方法编写规范,使用数据类型的替代参数。当编译器遇到类的构造函数或方法的函数调用时,它会生成代码来处理特定的数据类型。看看下面一个简单的例子将有助于理解这个概念:
using System
using System.Collections.Generic
namespace GenericApplication
{
public class MyGenericArray<T>
{
private T[] array
public MyGenericArray(int size)
{
array = new T[size + 1]
}
public T getItem(int index)
{
return array[index]
}
public void setItem(int index, T value)
{
array[index] = value
}
}
class Tester
{
static void Main(string[] args)
{
//declaring an int array
MyGenericArray<int> intArray = new MyGenericArray<int>(5)
//setting values
for (int i = 0 i < 5 i++)
{
intArray.setItem(i, i * 10)
}
//retrieving the values
for (int i = 0 i < 5 i++)
{
Console.Write(intArray.getItem(i) + " ")
}
Console.WriteLine()
//declaring a character array
MyGenericArray<char> charArray = new MyGenericArray<char>(5)
//setting values
for (int i = 0 i < 5 i++)
{
charArray.setItem(i, (char)(i + 97))
}
//retrieving the values
for (int c = 0 c < 5 c++)
{
Console.Write(charArray.getItem(c) + " ")
}
Console.WriteLine()
Console.ReadKey()
}
}
}
当上述代码被编译并执行时,它产生以下结果:
0 10 20 30 40
a b c d e
泛型特征
泛型是一种通过以下方式丰富程序的技术:
- 它可以帮助开发者最大限度地实现代码重用,类型安全和性能。
- 创建通用集合类。
.NET Framework
类库在System.Collections.Generic
命名空间中包含几个新的通用集合类。开发者使用这些通用集合类,而不是System.Collections
命名空间中的集合类。 - 创建自己的通用接口,类,方法,事件和委托。
- 可以创建限制为允许访问特定数据类型的方法的泛型类。
- 通过反射获取关于通用数据类型在运行时使用的类型的信息。
泛型方法
在前面的例子中,使用了一个泛型类 可以声明一个类型参数的泛型方法。以下程序说明了以下概念:
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 = 100
b = 201
c = &aposY&apos
d = &aposB&apos
//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)
//display values after swap:
Console.WriteLine("Int values after calling swap:")
Console.WriteLine("a = {0}, b = {1}", a, b)
Console.WriteLine("Char values after calling swap:")
Console.WriteLine("c = {0}, d = {1}", c, d)
Console.ReadKey()
}
}
}
当上述代码被编译并执行时,它产生以下结果:
Int values before calling swap:
a = 100, b = 201
Char values before calling swap:
c = Y, d = B
Int values after calling swap:
a = 201, b = 100
Char values after calling swap:
c = B, d = Y
泛型委托
可以使用类型参数定义一个泛型委托。 例如:
delegate T NumberChanger<T>(T n)
以下示例显示了如何使用此委托:
using System
using System.Collections.Generic
delegate T NumberChanger<T>(T n)
namespace GenericDelegateAppl
{
class TestDelegate
{
static int num = 101
public static int AddNum(int p)
{
num += p
return num
}
public static int MultNum(int q)
{
num *= q
return num
}
public static int getNum()
{
return num
}
static void Main(string[] args)
{
//create delegate instances
NumberChanger<int> nc1 = new NumberChanger<int>(AddNum)
NumberChanger<int> nc2 = new NumberChanger<int>(MultNum)
//calling the methods using the delegate objects
nc1(25)
Console.WriteLine("Value of Num: {0}", getNum())
nc2(5)
Console.WriteLine("Value of Num: {0}", getNum())
Console.ReadKey()
}
}
}
Value of Num: 126
Value of Num: 630