日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C#中泛型類和擴展方法如何使用_C#教程

作者:Darren?Ji ? 更新時間: 2022-11-29 編程語言

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

        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();
        }

總結:

  • 如果針對不同類型的操作邏輯是一樣的,就可以抽象出一個泛型類。泛型類和普通類沒有本質的區別,只不過在類名稱后面多了一個占位符、或者叫類型參數,泛型類的構造函數參數是類型參數,泛型類的屬性類型也是類型參數。
  • 如果針對不同類型實例的操作邏輯是一樣的,就可以針對不同實例類型的共同父類或接口寫一個擴展方法。

原文鏈接:https://www.cnblogs.com/darrenji/p/4452803.html

欄目分類
最近更新