泛型的定義
- 聲明類和方法的時(shí)候箩退,一般需要定義是什么類扯再,Class Dog,Class Cat等芍耘。當(dāng)針對(duì)不同類型,具有相同行為的時(shí)候熄阻,也就是方法可能是一樣的時(shí)候斋竞,那么泛型就發(fā)揮作用了。
泛型的優(yōu)點(diǎn)
- 使用泛型類秃殉、方法坝初,我們可以極大地提高代碼的重用性,不需要對(duì)類型不同钾军,代碼相同(僅參數(shù)不同)的代碼寫(xiě)多次
- 創(chuàng)建泛型類鳄袍,可在編譯時(shí)創(chuàng)建類型安全的集合
- 避免裝箱和拆箱操作,降低性能吏恭,在大型集合中裝箱和拆箱對(duì)性能的影響很大拗小。(裝箱:值類型轉(zhuǎn)成引用類型;拆箱:引用類型轉(zhuǎn)成值類型)
泛型的種類
- 在C#代碼中樱哼,在方法名后面使用<T>類型化的參數(shù)哀九,表示這是一個(gè)泛型方法,然后又在圓括號(hào)中使用了類型T搅幅,定義了類型T的參數(shù)變量t阅束,例:
public void GenericMethod<T>(T t);//泛型方法
public GenericClass<T>;//泛型類
public interface IGenericInterface<T> //泛型接口
{
void DoSomthing(T t);
}
public T[] GenericArray; //泛型數(shù)組
public delegate TOutput GenericDelagete<TInput, TOutput>(TInput input); //泛型委托
泛型方法使用舉例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TClassDemo
{
class Program
{
static void Main(string[] args)
{
var stuent = new Student();
stuent.Show(1);
stuent.Show("hello,world!");
Console.ReadKey();
}
public class Student
{
public void Show<T>(T t)
{
Console.WriteLine("The type is "+ t.GetType() +" Value is"+ t);
}
}
}
}
輸出結(jié)果
使用泛型方法的注意點(diǎn):
- 確定類型參數(shù),且在方法內(nèi)部處理時(shí)茄唐,要符合類型息裸,否則會(huì)出現(xiàn)類型錯(cuò)誤的情況
- 調(diào)用時(shí),可根據(jù)定義功能要求傳入具體的類型和實(shí)參值
- 泛型方法靈活性強(qiáng),但并不是所有方法都要使用泛型的呼盆,要根據(jù)實(shí)際情況來(lái)選擇
泛型類的使用
- 泛型類:常用于API通用接口的泛型類年扩,代碼摘自代碼
class Program
{
static void Main(string[] args)
{
List<Product> data = new List<Client.Product>() {
new Client.Product() { Id=12,Name="土豆"},
new Client.Product() { Id=12,Name="茄子"},
new Client.Product() { Id=12,Name="黃瓜"}
};
var resultProduct = Result<Product>.Success(data);
var resultUser = Result<User>.Error("沒(méi)有數(shù)據(jù)");
foreach (var item in resultProduct.Data)
{
Console.WriteLine(item.Id+","+item.Name);
}
Console.WriteLine(resultUser.IsSuccess+resultUser.Message);
}
}
public class Result<T> { //泛型類,聲明T變量類型
public bool IsSuccess { get; set; }
public List<T> Data { get; set;}//未定義具體類型的泛型集合
public string Message { get; set; }
public static Result<T> Error(string message)
{
return new Client.Result<T> { IsSuccess = false, Message = message };
}
//泛型方法宿亡,初始化數(shù)據(jù)
public static Result<T> Success(List<T> data)
{
return new Client.Result<T> { IsSuccess =true,Data =data}; //成功就沒(méi)有提示消息的原則
}
}
public class Product {
public int Id { get; set; }
public string Name { get; set; }
}
public class User {
public int Age { get; set; }
public string Name { get; set; }
}
泛型集合和ArrayList
- 看到CSDN上面一個(gè)大牛說(shuō)的常遂,覺(jué)得很有道理,整理如下:
System.Collections.ArrayList list1 = new System.Collections.ArrayList();
list1.Add(3);
list1.Add(105);
System.Collections.ArrayList list2 = new System.Collections.ArrayList();
list2.Add("科比");
list2.Add("詹姆斯");
- ArrayList是一個(gè)極為方便的集合類挽荠,可以用于存儲(chǔ)任何引用或值類型克胳。但是缺點(diǎn)也很明顯,第一個(gè)缺點(diǎn)是編譯的時(shí)候不會(huì)檢查類型圈匆,例如:
System.Collections.ArrayList list1 = new System.Collections.ArrayList();
list1.Add(3);
list1.Add(105);
list1.Add("sd");
foreach (int item in list1)
{
Console.WriteLine(item.ToString());
}
-
編譯正常漠另,運(yùn)行的時(shí)候會(huì)出現(xiàn)轉(zhuǎn)換類型錯(cuò)誤。至于ArrayList第二個(gè)缺點(diǎn)就是裝箱拆箱的時(shí)候回造成性能的損失跃赚。我們看看ArrayList的Add方法的定義笆搓。
- 參數(shù)是一個(gè)object類型,也就是說(shuō)ArrayList添加任何引用類型或值類型都會(huì)隱士轉(zhuǎn)換成Object纬傲,這個(gè)時(shí)候便發(fā)生裝箱操作满败,在遍歷檢索它們時(shí)必須從object 類型轉(zhuǎn)換成指定的類型,這個(gè)時(shí)候便發(fā)生拆箱操作叹括。這兩種操作會(huì)大大降低性能算墨。所以.net 2.0的程序時(shí)應(yīng)該放棄使用ArrayList,推薦使用使用List《T》 泛型集合汁雷。這也是我們?yōu)槭裁匆褂梅盒偷脑蛑弧?/li>