天天看點

範型

字典Dict

//使string鍵不區分大小寫
Dictionary<string, int> things =new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);

Dictionary<string, int> sta = new Dictionary<string, int>()
{//初始化索引器 [key] = value
    ["str1"] = 6,
    ["str2"] = 7
};      

定義範型類

class MyClass<T1,T2,T3>
{//不能直接将T1當做類建立執行個體
    private T1 type1;
    public MyClass(T1 item1) => type1 = item1;
    public T1 Type1 { get => type1;}
    public bool Compare(T1 op1,T2 op2)
    {
        return op1 != null && op2 != null;
    }
}      

Default關鍵字

用于執行個體化時為不同類型的字段或屬性指派

class Default關鍵字<T>
{
    private T t1;
    /// <summary>
    /// 當不能确定值類型或引用類型時,用下述方法
    /// 此時若T為引用類型則指派null,T為值類型則指派0
    /// </summary>
    public Default關鍵字()
    {
        t1 = default(T);
    }
}      

限制類型

對範型類型進行限制,使其可用類型受到限制

限制 定義
struct 類型必須是值類型
class 類型必須是引用類型
base-class 類型必須是基類或繼承自基類。可以給這個限制提供任意類名。
interface 類型必須是接口或實作了接口
new() 類型必須有一個公共的無參構造函數

注意:如果new()用作限制,他就必須是為類型指定的最後一個限制

class Where限制<T1, T2,T3>where T1 :struct  where T2 :T3
{
    //限制必須是接口、非密封類或類型參數
    //在繼承含有限制的範型時,T不能超集
}      
class Animals<T1> where T1:Animal
{
    private List<T1> animal;
    public List<T1> Animal { get => animal; }
    public void Tests() 
    {
        foreach (T1 str in Animal)
        {
            //對str操作
        }
    }
}      

多态性的運用

範型方法與多态性的結合,例如如下方法,可以篩選出任意Animal下的子類型

class Animals<T1> where T1:Animal
{
    private List<T1> animal;
    public List<T1> Animal { get => animal; }
    public Animals<U> GetAnimals<U>() where U:T1
    {//
        Animals<U> animalss = new Animals<U>();
        foreach (T1 ani in Animal)
        {
            if(ani is U)
                animalss.animal.Add(ani as U);//此處ani必須有明确的類型限制,不然會報錯
        }
        return animalss;
    }
}      

範型結構

public struct MyStruct<T1,T2>
{//範型結構
    public T1 t1;
    public T2 t2;
    public T1 t3;
    public T2 t4;
}      

範型接口

public interface MyAnimalInterface<T1> where T1 : struct
{//範型接口
    void Test1(T1 a1, T1 a2);
    int GetInt(T1 a1);
    T1 GetT1 { get;}
}