什麼叫泛型?
以下爲自己的個人理解:
是把重複的類進行一個整合防止類型膨脹,成員膨脹。
在定義一個類,接口,方法等的時候不明確定義類型用 <類型參數> 來定義,等要使用的時候再去明確定義,這就是泛型。
類型參數是指一個泛化的類型,就是用一個標識符來表示,標識符是由自己命名,可以是ABD,DSD。
泛型有正交性,個人理解是有許多種泛型:泛型類,泛型接口,泛型委託,泛型方法等等
例子1 泛型類:
下面是一個商店裏的包裝,商店裏的蘋果和書本用盒子裝起來,因爲蘋果和書長不一樣,所以我要使用不同的盒子。
打個比方,蘋果有不同顏色和牌子,有青蘋果和紅蘋果,有富士山蘋果等等,所以我要在蘋果的盒子上寫蘋果的顏色(color)和牌子(brand),書有很多,每本書的作者也可能不一樣,比如哈姆雷特是莎士比亞寫的,悲慘世界是雨果寫的,在書的盒子外面要寫上作者(Author)和名字(Name)來區分。
於是就有了蘋果盒子(AppleBox),書本盒子(BookBox),但是他們本質上都是盒子,那麼我們可以先把盒子買來,但是先不決定它是什麼盒子(假設這裏的這個盒子貼上啥標籤就會變成什麼盒子),等要用盒子的時候,再給這個盒子貼上標籤來確定是蘋果盒子還是書本盒子。
我的蘋果和書本分別是Apple和Book類型,把盒子定義爲一個泛型類(Box),它的類型定義爲,TCargo是我自己的定義的,表示貨物類型,這個<>裏面的標識符由自己定義,當我要使用盒子的時候,就把TCargo改爲我要裝進去的物品類型,比如是書本盒子就變成Box,以下是具體例子
static void Main(string[] args)
{
Apple apple = new Apple {
Color = "Red" ,Brand="富士山"};
Book book = new Book {
Name = "哈姆雷特" ,Author="莎士比亞"};
Box<Apple> box1 = new Box<Apple> {
Cargo = apple };
Box<Book> box2 = new Box<Book> {
Cargo = book };
Console.WriteLine("蘋果顏色:{0},牌子:{1}", box1.Cargo.Color,box1.Cargo.Brand);
Console.WriteLine("書名:{0},作者:{1}",box2.Cargo.Name,box2.Cargo.Author);
}
class Apple
{
public string Color {
get; set; }
public string Brand {
get; set; }
}
class Book
{
public string Name {
get; set; }
public string Author {
get; set; }
}
class Box<TCargo>
{
public TCargo Cargo {
get; set; }
}
運行結果
例子2 泛型接口:
static void Main(string[] args)
{
Student<ulong> student = new Student<ulong> {
};
//使用接口時沒有特化泛型接口
student.ID = 10000000000001;
student.Name = "莎士比亞";
//使用接口時特化泛型接口
Teacher teacher = new Teacher {
};
teacher.ID = 1000000000000001;
teacher.Name = "孔子";
}
interface IUnique<TId>
{
TId ID {
get; set; }
}
//使用接口時沒有特化泛型接口
class Student<TId> : IUnique<TId>
{
public TId ID {
get; set; }
public string Name;
}
//使用接口時特化泛型接口
class Teacher : IUnique<ulong>
{
public ulong ID {
get; set; }
public string Name;
}
}
例子3 泛型方法
static void Main(string[] args)
{
int[] a1 = {
1, 3, 5, 7 };
int[] a2 = {
2, 4, 6, 8 };
double[] a3 = {
1.1, 3.3, 5.5, 7.7 };
double[] a4 = {
2.2, 4.4, 6.6, 8.8 };
var result = zip(a1, a2);
Console.WriteLine(string.Join(",", result));
}
static T[] zip<T>(T[] a, T[] b)
{
T[] zipped = new T[a.Length + b.Length];
int ai = 0, bi = 0, zi = 0;
do
{
if (ai < a.Length)
{
zipped[zi++] = a[ai++];
}
if (bi < b.Length)
{
zipped[zi++] = b[bi++];
}
} while (ai < a.Length || bi < b.Length);
return zipped;
}
小筆記
記一下,以後有問題再回來改,如果有錯誤也可以在評論區指出
有待補充…