asp.net 泛型、泛型約束

開篇先說一下泛型的優點

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() 這種順序組成的,可以減少,但是順序不能亂










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章