程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 關於泛型類和擴展方法的一點思考,泛型擴展思考

關於泛型類和擴展方法的一點思考,泛型擴展思考

編輯:C#入門知識

關於泛型類和擴展方法的一點思考,泛型擴展思考


 

我們經常通過泛型構造函數創建泛型實例,也常調用實例的擴展方法。以下的代碼在項目中隨處可見:

 

        static void Main(string[] args)
        {
            var strs = new List<string> {"hello","world"};
            var result = strs.Where(s => s.StartsWith("h"));
            foreach (var item in result)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }

 

以上,

 

● 通過泛型集合List<T>的構造函數創建了實例,內部是如何實現的呢?

 

● 對實例變量strs采用Where方法,我們發現Where也足夠”聰明”,因為它是針對IEnumerable集合類型的擴展方法。

 

.NET內部到底是如何實現的呢?不妨臨摹一下~~

 

創建一個類型泛型。

 

    public class MyCute<T>
    {
        public MyCute(T t)
        {
            GetCute = t;
        }
        public T GetCute { get; set; }
    }    

 

在客戶端這樣調用:

 

        static void Main(string[] args)
        {
            var cuteInt = new MyCute<int>(10);
            var cuteStr = new MyCute<string>("hello");
            Console.WriteLine(cuteInt.GetCute);
            Console.WriteLine(cuteStr.GetCute);
            Console.ReadKey();
        }

 

以上,或許得到的啟示是:如果想通過構造函數創建泛型實例,需要定義一個泛型類,一個泛型類型的屬性,一個把泛型類型作為參數的構造方法。

 

現在想對泛型實例cuteInt和cuteStr的屬性GetCute使用擴展方法,如何做呢?

 

cuteInt的屬性GetCute是int類型,cuteStr的屬性GetCute是string類型,兩者的共同基類是object,那就針對object類型寫一個擴展方法。

 

    public static class MyHelper
    {
        public static string GetStr(this object obj)
        {
            return obj.ToString() + "--added string";
        }
    }

 

客戶端變成這樣:

 

        static void Main(string[] args)
        {
            var cuteInt = new MyCute<int>(10);
            var cuteStr = new MyCute<string>("hello");
            Console.WriteLine(cuteInt.GetCute.GetStr());
            Console.WriteLine(cuteStr.GetCute.GetStr());
            Console.ReadKey();
        }    

 

總結:

 

● 如果針對不同類型的操作邏輯是一樣的,就可以抽象出一個泛型類。泛型類和普通類沒有本質的區別,只不過在類名稱後面多了一個占位符、或者叫類型參數,泛型類的構造函數參數是類型參數,泛型類的屬性類型也是類型參數。

 

● 如果針對不同類型實例的操作邏輯是一樣的,就可以針對不同實例類型的共同父類或接口寫一個擴展方法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved