C# 泛型(Generics)

  • 5375
  • 0
  • C#
  • 2017-09-29

Generics

泛型,讓我們可以用更有彈性的方式來設計Class、Method,操作資料

C# DB JAVA 都是強烈型態的語言,你必須告訴他到底此參數為合型態才不會有編譯錯誤的問題

但是這也造成code上缺乏彈性的問題

方法泛型 (Generic Method)

假設 我們寫了一個方法是計算兩個整數的加總,但當我們要計算浮點數(double)時,就無法使用這個方法

public void calN(int a,int b){
   Console.writeLine(a+b);
}

因此,這時就是泛型強大的地方。

例如:我們的s方法會輸出我們所傳遞的參數類型(GetType) value,這時後透過泛型類型 <型別參數T>來代表型別(int, string, double...) 可以先不定義到底要是怎樣的類型

而在呼叫給他類型便可以印出

namespace ConsoleApplication1
{
    class Program
    {
        public void s<T>(T a)
        {
            Console.WriteLine("參數類型" + a.GetType()+",值"+a);          
        }
        static void Main(string[] args)
        {
            Program p = new Program();
            p.s<int>(2);
            p.s<string>("dd");
        }
    }
}

很酷的一點是當我們沒告訴s方法他到底是什麼類型的參數時,最後編譯出來的仍可以輸出上面那個輸出框

因為C#在編譯時,自己會自動判斷參數類型

namespace ConsoleApplication1
{
    class Program
    {
        public void s<T>(T a)
        {
            Console.WriteLine("參數類型" + a.GetType()+",值"+a);          
        }
        static void Main(string[] args)
        {
            Program p = new Program();
            p.s(2);
            p.s("dd");
        }
    }
}

類別泛型 (Generic Class)

類別的泛型,一樣在class使用泛型,且直接加上 <型別參數T> 即可

Resize參考

namespace ConsoleApplication1
{
    public class Program<T>
    {
        T[] array = new T[0];

        //一個一個加入
        public void add(T item)
        {
            // 將一維陣列中的項目數目變更為指定的新大小。
            Array.Resize(ref array, array.Length + 1);
            array[array.Length - 1] = item;
        }
        
        public T[] all()
        {
            return array;
        }
    }
    class a
    {
        static void Main(string[] args)
        {
            Program<int> p = new Program<int>();
            p.add(3);
            p.add(5);
            p.add(6);

            foreach (int row in p.all())
            {
                Console.WriteLine(row);
            }
        }
    }
}

參考資料:

1. C# 泛型(Generics) - 教學筆記 (使用visual studio)