泛型的學習 一、泛型的引入 泛型 泛:寬泛的--不確定的; 型:類型 不確定的類型 無處不在的 調用普通方法的時候,參數類型在聲明的時候就確定了,調用按照類型傳遞參數即可 a. 如果有100個類型 100個方法?--很累 b. 有沒有能夠做一個方法可以能夠滿足不同類型的需求呢? 傳統方法 publi ...
泛型的學習
一、泛型的引入
- 泛型---泛:寬泛的--不確定的; 型:類型---不確定的類型
- 無處不在的
- 調用普通方法的時候,參數類型在聲明的時候就確定了,調用按照類型傳遞參數即可
a. 如果有100個類型---100個方法?--很累
b. 有沒有能夠做一個方法可以能夠滿足不同類型的需求呢?
傳統方法
public static class CommonMethod
{
public static void ShowInt(int Parameter)
{
Console.WriteLine($"This is {typeof(CommonMethod).Name} parameter={Parameter},type={Parameter.GetType().Name} ");
}
public static void ShowString(string Parameter)
{
Console.WriteLine($"This is {typeof(CommonMethod).Name} parameter={Parameter},type={Parameter.GetType().Name} ");
}
public static void ShowDateTime(DateTime Parameter)
{
Console.WriteLine($"This is {typeof(CommonMethod).Name} parameter={Parameter},type={Parameter.GetType().Name} ");
}
}
- Object類型作為參數 ----可以傳遞不同的參數
a. 任何子類出現的地址都可以讓父類來代替
b. 萬物皆對象---任何一個類型都是繼承自Object
使用Object類型
public static class CommonMethod
{
public static void ShowObject(object Parameter)
{
Console.WriteLine($"This is {typeof(CommonMethod).Name} parameter={Parameter},type={Parameter.GetType().Name} ");
}
}
- 問題
a. 性能問題 ---裝箱拆箱---在c#語法中,按照聲明時決定類型的(棧、托管堆)
b. 類型安全問題
我們通過一個例子來體現性能的問題
public class PerformanceTest
{
public static void Show()
{
int ivalue = 1234;
//消耗的時間
long commonSecond = 0;
long objectSecond = 0;
long genericSecond = 0;
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000_000_000; i++) {
ShowInt(ivalue);
}
sw.Stop();
commonSecond = sw.ElapsedMilliseconds;
}
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000_000_000; i++)
{
ShowObject(ivalue);
}
sw.Stop();
objectSecond = sw.ElapsedMilliseconds;
}
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000_000_000; i++)
{
Show(ivalue);
}
sw.Stop();
genericSecond = sw.ElapsedMilliseconds;
}
Console.WriteLine($"commonSecond: {commonSecond} objectSecond: {objectSecond} genericSecond :{genericSecond} ");
}
private static void ShowInt(int r)
{
}
private static void ShowObject(object o)
{
}
private static void Show<T>(T parameter)
{
}
}
結果為:
- 有沒有既性能好,也能夠支持多種類型的方法呢?---泛型方法
a. 聲明多了一對尖括弧 + 占位符T
b. 調用--也需要多一對尖括弧,尖括弧中指定的類型要和傳遞的參數的類型一致。
c. 如果可以參數推到出類型---尖括弧可以省略。 - 泛型方法---做到了性能高---可以一個方法滿足不同類的需求:---又讓馬兒跑,又讓馬吃草
二、泛型的聲明
1.泛型方法:在方法名稱後面多一對尖括弧,尖括弧中有占位符
2.延遲聲明:聲明的時候,只是給一個占位符T,T是什麼類型?不知道什麼類型---調用的時候,指定你是什麼,調用的時候,你說什麼就是什麼;
3.占位符: T ---類型參數 --- 類型變數
4.類型參數當作方法的參數的時候,明確參數類型。