昨天簡單的介紹了型別的分類,雖然我還有很多細節的地方都沒講道,我也會在後面的鐵人賽來做個調整。那今天我要來講甚麼呢,相信很多人知道C#是強型別
,所以在很多型別的使用上限制了很多,所以我們需要一個方式來讓型別的使用更有彈性,哪就介紹到我們今天的主題泛型(Generics)
泛型 甚麼東西? 能吃嗎?
應該很多人跟我依樣剛接觸到這東西時也是一臉黑人問號,所以今天就由我來說明泛型
是甚麼東西,他能幫我們甚麼忙!!!
泛型程式設計,簡稱泛型(Generic)是程式設計語言的一種風格或範式。泛型代碼可以讓你寫出根據自我需求定義、適用於任何類型的,靈活且可重用的函數和類型。它可以讓你避免重複的代碼,用一種清晰和抽像的方式來表達代碼的意圖。泛型的格式通常會長這樣 泛型類型 <型別參數T>
,而這個型別參數通常用 T 或 T1、T2…來代表,或者放 int、string等等,而由我所知常見的泛型可以用在方法(method)或者類別(class),除了這兩種還可以在很多地方看到泛型的運用。這裡我就以這兩種方式做個簡單的操作
這裡的話,我是先用方法(method)的方式來做個練習,這裡可以知道在Test<T>
裡的型別參數會針對在實例化時做個設定像在下面就有針對 int、string、ExampleClass做參數的設定
public class ExampleClass{
public string name {get; set;}
public int id {get; set;}
public bool sex {get; set;}
};
public static void Test<T>(T input)
{
Console.WriteLine(input.GetType());
Console.WriteLine(input);
}
static void Main(string[] args)
{
Test<string>("hello world");
Test<int>(123456789);
ExampleClass exampleClass = new ExampleClass();
exampleClass.name = "王八";
exampleClass.id = 123456789;
exampleClass.sex = true;
Test<ExampleClass>(exampleClass);
}
最後跑完的結果應該會如下,那應該就沒什麼問題
System.String
hello world
System.Int32
123456789
Program+ExampleClass
Program+ExampleClass
下面的話就是針對類別(class)做的練習,其實做的方法跟方法很類似,這裡變成我們在類別加上型別參數,在實例化的地方把我們要設定的地方放入我們要使用的型態
public class Generic<T>
{
public void Test(T input)
{
Console.WriteLine(input);
}
}
private class ExampleClass{};
static void Main(string[] args)
{
Generic<int> generic1 = new Generic<int>();
generic1.Test(123456789);
Generic<string> generic2 = new Generic<string>();
generic2.Test("hello world");
Generic<ExampleClass> generic3 = new Generic<ExampleClass>();
generic3.Test(new ExampleClass());
}
最後來說說為甚麼需要泛型,在C#剛出現時並沒有甚麼泛型,是在2.0版本後加進來的功能,但是在有泛型之前我們需要建立一個型別的集合要怎麼辦呢?
依我所知在沒有泛型這方法之前是要透過 ArrayList
的方法來達成,然後在透過 ArrayList.Add() 新增內容,但這就會有個問題,新增資料時你不能確定每次的 object 都會是一樣的標準作新增,這就可能造成資料上無法達到統一性,所以泛型的出現解決的C#上類似的問題,除了解決在資料上通一的問題,也大幅減少 runtime 時期所消耗的效能
今天這主題也是突然想到有這東西,所以沒有準備得很充實,但是至少在簡單的理解與應用上也有一定的了解,那麼今天的鐵人賽就到這裡啦,我們明天見~~~