程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> C#之泛型

C#之泛型

編輯:C#基礎知識

泛型是C# 2.0版本才有的語言特性,是具有參數類型占位符的類、結構、接口和方法。這些占位符是類、結構、接口和方法所存儲或使用的一個或多個占位符。簡單來說,就是變量類型的參數化。

以下是詳細demo:

    #region 泛型的約束
        
    /// <summary>
    /// 1.0基類約束
    /// </summary>
    /// <typeparam name="T">約束成了將來調用的時候只能傳入Pig本身或者其子類</typeparam>
   public  class House<T> where T:Pig
    {

    }

    /// <summary>
    /// 2.0 引用類型約束
    /// </summary>
    /// <typeparam name="T">約束成了將來調用的時候只能傳入引用類型參數</typeparam>
    public class House1<T> where T:class
    {

    }

    /// <summary>
    /// 3.0值類型約束
    /// </summary>
    /// <typeparam name="T">約束成了將來調用的時候只能傳入值類型參數</typeparam>
    public class House2<T> where T:struct
    {

    }

    /// <summary>
    /// 4.0接口約束
    /// </summary>
    /// <typeparam name="T">約束成了將來調用的時候只能傳入Ipig本身或者Ipig的實現類型參數</typeparam>
    public class House3<T>where T:IPig
    {

    }

    /// <summary>
    /// 5.0構造器約束
    /// </summary>
    /// <typeparam name="T">約束成了將來調用的時候只能傳入 構造器參數</typeparam>
    public class House4<T>where T:class ,new()
    {
        T t;
        public House4()
        {
            t = new T();
        }
    }

    /// <summary>
    /// 多個參數約束
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <typeparam name="V"></typeparam>
    public class House6<T, V>
        where T : class
        where V : struct
    {

    }
 
    #endregion

    #region 泛型的繼承
    public class DogHouse6 : House6<Dog, int>
    {

    }

    public class DogHouse61<X, Y> : House6<X, Y>
        where X : class
        where Y : struct
    {

    }

    public class DogHouse62<X, Y> : House6<Pig, decimal>
    {
        
    }
    
    #endregion

    #region 泛型方法
    /// <summary>
    /// 泛型方法  有下列任何一項  均構成重載:
    /// 1.泛型方法的參數個數不一致 
    /// 2.參數類型不一致
    /// 3.類型占位符個數不一致
    /// 
    /// 
    /// 泛型方法的類型占位符個數一致,但名字不一樣 不會構成重載
    /// </summary>
    public class UserInfoBll
    {
        public T Get<T>(T t)
        {
            return t;
        }

        public string GetName<T>(T t, int num)
        {
            T tt = t;
            return "某一個參數類型為泛型,返回值為string";
        }

        public string GetName<T, V>(T t, int num)
        {
            T tt = t;
            return "返回值";
        }

        public T GetName<T>(string str)
        {
            return default(T);
        }

        public string GetName<T>(T t)
        {
            T tt = t;
            return "返回值";
        }
    }

    public class UserInfoBll1<T>
    {
        T tt;
        public T GetT(T t)
        {
            tt = t;
            return tt;
        }
    } 
    #endregion

    #region 泛型方法的重寫
    public abstract class Father
    {
        public abstract T SayHi<T, U>(T t, U u) where U : T; // U必須繼承於T

        public abstract T Think<T>(T t) where T : Pig;
    }

    /// <summary>
    /// 子類重寫父類中的抽象泛型方法的時候,不需要單獨再將類型占位符 重新添加約束
    /// </summary>
    public class Son : Father
    {
        public override T SayHi<T, U>(T t, U u)
        {
            return t;
        }

        public override T Think<T>(T t)
        {
            return default(T);
        }
    } 
    #endregion

使用泛型進行緩存管理:

  public   class CacheMgr<T>
    {
      public static T Get(string cacheKey)
      {
          return (T)HttpRuntime.Cache[cacheKey];
      }

      public static void Add<TT>(string cacheKey,TT value)
      {
          HttpRuntime.Cache[cacheKey] = value;
      }
    }
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved