開篇先說一下泛型的優點
1、可以通過一個方法實現多種參數的調用
2、性能無損失
3、生命方法的時候沒有指定類型,調用的時候指定,這就是一種延遲
泛型的創建舉例
泛型方法
public static void Show<T>(T t)
{
Console.WriteLine("參數類型是:{0}",typeof(T));
}
調用方法
string sValue = "這裏是一串漢字";
Generic.Show<string>(sValue);
Generic.Show(sValue);//這樣<string>不寫 系統也會根據傳入參數自行判斷類型
泛型接口
public interface Iinterface<T>
{
void Say();
}
注:繼承泛型接口是有限制的,有2種方式
第一種:類也是泛型
public class NewClass<T> : Iinterface<T>
{
public void Say()
{
}
}
第二種:直接指定接口泛型參數類型
public class NewClass:Iinterface<string>
{
public void Say()
{
}
}
泛型類
public class Tclass<T>
{
}
泛型委託
public delegate void Tdelegate<T>(T t);
多泛型參數
泛型參數不是隻能設置一個T,而且也不一定必須叫T ,T只是一個佔位符而已 並且可以多個
public static void Show<T, S, W, Y>(T t, S s, W w, Y y)
{
}
泛型返回值
public T ShowIs<T>()
{
return default(T);//根據類型返回默認值
}
下面代碼表示,對T參數進行約束 傳入的需要是一個引用類型參數
public static void Show1<T>(T t)
where T:class
{
Console.WriteLine("參數類型是:{0}", typeof(T));
}
如果這個時候 傳入一個值類型 就會報錯了,如圖
當然 也可以約束只能傳入一個值類型,如下
public static void Show2<T>(T t)
where T : struct//需要傳入一個值類型
{
Console.WriteLine("參數類型是:{0}", typeof(T));
}
或者是一個自定義類
public class People
{
}
public static void Show3<T>(T t)
where T : People//需要傳入People類型或者他的子類
{
Console.WriteLine("參數類型是:{0}", typeof(T));
}
或者繼承某一個接口
public interface Iinterface1
{
}
public static void Show3<T>(T t)
where T : Iinterface1//需要傳入的類型繼承該接口
{
Console.WriteLine("參數類型是:{0}", typeof(T));
}
或者必須有一個無參構造函數(可以約束無參構造函數但不可以約束有參數的構造函數)
有new()約束 還可以創建T對象哦
public static void Show3<T>(T t)
where T : new()//需要傳入的類型有無參構造函數
{
T t = new T();//設置了new()約束後可以創建對象哦
Console.WriteLine("參數類型是:{0}", typeof(T));
}
當然。也可以設置多個約束哦
public static void Show3<T>(T t)
where T : People, Iinterface1, Iinterface2,new()//多約束類型
{
Console.WriteLine("參數類型是:{0}", typeof(T));
}
多約束類型需要注意 他是由 一個類+多個接口+一個new() 這種順序組成的,可以減少,但是順序不能亂