C#泛型
泛型允許延遲編程元素的類或方法的數據類型的規範,直到它在程序中實際使用時確定。 換句話說,泛型允許編寫一個可以使用任何數據類型的類或方法。
爲類或方法編寫規範,使用數據類型的替代參數。當編譯器遇到類的構造函數或方法的函數調用時,它會生成代碼來處理特定的數據類型。看看下面一個簡單的例子將有助於理解這個概念:
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 = 'Y';
d = 'B';
//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