前言
從簡單的例子理解泛型
話說有家影視公司選拔偶像派男主角
//男演員實體類
public class Boy
{
//姓名
private string mName;
//身高
private int mHeight;
public string Name {
get { return this
}
public int Height {
get { return this
}
public Boy(string name
this
this
}
}
//演員選拔類
public class Compare
{
//導演導超女出生
public Boy WhoIsBetter(Boy boy
{
if (boy
{
return boy
}
else
{
return boy
}
}
}
//測試
static void Main(string[] args)
{
Boy boy
Boy boy
Console
Console
}
代碼很簡單
任何行業都是一樣
//添加女演員實體
public class Girl
{
//姓名
private string mName;
//體重
private int mWeight;
public string Name
{
get { return this
}
public int Weight
{
get { return this
}
public Girl(string name
this
this
}
}
//演員選拔類中添加一個女演員方法
public class Compare
{
//男演員身高是王道
public Boy WhoIsBetter(Boy boy
{
if (boy
{
return boy
}
else
{
return boy
}
}
//女演員苗條是王道
public Girl WhoIsBetter(Girl girl
{
if (girl
{
return girl
}
else
{
return girl
}
}
}
//測試
static void Main(string[] args)
{
Boy boy
Boy boy
Girl girl
Girl girl
Console
Console
Console
}
結果選出了身高更高的劉德華
/// <summary>
/// 男演員
/// </summary>
public class Boy : IComparable
{
//姓名
private string mName;
//身高
private int mHeight;
public string Name {
get { return this
}
public int Height {
get { return this
}
public Boy(string name
this
this
}
public int CompareTo(object obj)
{
//比較身高
return this
}
}
/// <summary>
/// 女演員
/// </summary>
public class Girl : IComparable
{
//姓名
private string mName;
//體重
private int mWeight;
public string Name
{
get { return this
}
public int Weight
{
get { return this
}
public Girl(string name
this
this
}
public int CompareTo(object obj)
{
//比較體重
return ((Girl)obj)
}
}
首先讓實體類支持自定義的比較
public class Compare
{
//萬物皆object
public object WhoIsBetter(object obj
{
object result = obj
//判斷比較類型必須相同
if (obj
{
switch (obj
{
//男演員選拔
case
if (((Boy)obj
{
result = obj
}
break;
//女演員選拔
case
if (((Girl)obj
{
result = obj
}
break;
//擴展int類型比較
case
if (((System
{
result = obj
}
break;
}
}
return result;
}
}
修改WhoIsBetter方法
//測試
static void Main(string[] args)
{
Boy boy
Boy boy
Girl girl
Girl girl
Console
Console
Console
Console
Console
}
測試結果
劉德華
周迅
OK
弱點
假設我們要讓WhoIsBetter方法支持更多類型
弱點
//測試
static void Main(string[] args)
{
Boy boy
Boy boy
Girl girl
Girl girl
Console
Console
}
如上代碼我拿潘長江跟鞏俐去比較
弱點
當向WhoIsBetter方法中傳遞int參數時
if (((System
反編譯獲取MSIL:
IL_
C#是強類型語言
理解泛型
OK
看看使用泛型的解決方案
public class Compare<T> where T : IComparable
{
public T WhoIsBetter(T t
{
if (t
{
return t
}
else
{
return t
}
}
}
//測試
static void Main(string[] args)
{
Boy boy
Boy boy
Girl girl
Girl girl
Console
Console
Console
Console
Console
}
這段代碼在優雅度上完勝非泛型
public class Compare<T> where T : IComparable{
//…
}
泛型類的定義是在類名後面跟上<T>
where T : IComparable
關於泛型參數約束
DEMO下載
Visual Studio
From:http://tw.wingwit.com/Article/program/net/201311/13572.html