1. 程式人生 > 程式設計 >例項講解C# 泛型(Generic)

例項講解C# 泛型(Generic)

泛型(Generic) 允許您延遲編寫類或方法中的程式設計元素的資料型別的規範,直到實際在程式中使用它的時候。換句話說,泛型允許您編寫一個可以與任何資料型別一起工作的類或方法。

您可以通過資料型別的替代引數編寫類或方法的規範。當編譯器遇到類的建構函式或方法的函式呼叫時,它會生成程式碼來處理指定的資料型別。下面這個簡單的例項將有助於您理解這個概念:

using System;
using System.Collections.Generic;

namespace GenericApplication
{
  public class MyGenericArray<T>
  {
    private T[] array;
    public MyGenericArray(int size)
    {
      array = new T[size + 1];
    }
    public T getItem(int index)
    {
      return array[index];
    }
    public void setItem(int index,T value)
    {
      array[index] = value;
    }
  }
      
  class Tester
  {
    static void Main(string[] args)
    {
      // 宣告一個整型陣列
      MyGenericArray<int> intArray = new MyGenericArray<int>(5);
      // 設定值
      for (int c = 0; c < 5; c++)
      {
        intArray.setItem(c,c*5);
      }
      // 獲取值
      for (int c = 0; c < 5; c++)
      {
        Console.Write(intArray.getItem(c) + " ");
      }
      Console.WriteLine();
      // 宣告一個字元陣列
      MyGenericArray<char> charArray = new MyGenericArray<char>(5);
      // 設定值
      for (int c = 0; c < 5; c++)
      {
        charArray.setItem(c,(char)(c+97));
      }
      // 獲取值
      for (int c = 0; c < 5; c++)
      {
        Console.Write(charArray.getItem(c) + " ");
      }
      Console.WriteLine();
      Console.ReadKey();
    }
  }
}

當上面的程式碼被編譯和執行時,它會產生下列結果:

0 5 10 15 20
a b c d e

泛型(Generic)的特性

使用泛型是一種增強程式功能的技術,具體表現在以下幾個方面:

  • 它有助於您最大限度地重用程式碼、保護型別的安全以及提高效能。
  • 您可以建立泛型集合類。.NET 框架類庫在 System.Collections.Generic 名稱空間中包含了一些新的泛型集合類。您可以使用這些泛型集合類來替代 System.Collections 中的集合類。
  • 您可以建立自己的泛型介面、泛型類、泛型方法、泛型事件和泛型委託。
  • 您可以對泛型類進行約束以訪問特定資料型別的方法。
  • 關於泛型資料型別中使用的型別的資訊可在執行時通過使用反射獲取。

泛型(Generic)方法

在上面的例項中,我們已經使用了泛型類,我們可以通過型別引數宣告泛型方法。下面的程式說明了這個概念:

using System;
using System.Collections.Generic;

namespace GenericMethodAppl
{
  class Program
  {
    static void Swap<T>(ref T lhs,ref T rhs)
    {
      T temp;
      temp = lhs;
      lhs = rhs;
      rhs = temp;
    }
    static void Main(string[] args)
    {
      int a,b;
      char c,d;
      a = 10;
      b = 20;
      c = 'I';
      d = 'V';

      // 在交換之前顯示值
      Console.WriteLine("Int values before calling swap:");
      Console.WriteLine("a = {0},b = {1}",a,b);
      Console.WriteLine("Char values before calling swap:");
      Console.WriteLine("c = {0},d = {1}",c,d);

      // 呼叫 swap
      Swap<int>(ref a,ref b);
      Swap<char>(ref c,ref d);

      // 在交換之後顯示值
      Console.WriteLine("Int values after calling swap:");
      Console.WriteLine("a = {0},b);
      Console.WriteLine("Char values after calling swap:");
      Console.WriteLine("c = {0},d);
      Console.ReadKey();
    }
  }
}

當上面的程式碼被編譯和執行時,它會產生下列結果:

Int values before calling swap:
a = 10,b = 20
Char values before calling swap:
c = I,d = V
Int values after calling swap:
a = 20,b = 10
Char values after calling swap:
c = V,d = I

泛型(Generic)委託

您可以通過型別引數定義泛型委託。例如:

delegate T NumberChanger<T>(T n);

下面的例項演示了委託的使用:

using System;
using System.Collections.Generic;

delegate T NumberChanger<T>(T n);
namespace GenericDelegateAppl
{
  class TestDelegate
  {
    static int num = 10;
    public static int AddNum(int p)
    {
      num += p;
      return num;
    }

    public static int MultNum(int q)
    {
      num *= q;
      return num;
    }
    public static int getNum()
    {
      return num;
    }

    static void Main(string[] args)
    {
      // 建立委託例項
      NumberChanger<int> nc1 = new NumberChanger<int>(AddNum);
      NumberChanger<int> nc2 = new NumberChanger<int>(MultNum);
      // 使用委託物件呼叫方法
      nc1(25);
      Console.WriteLine("Value of Num: {0}",getNum());
      nc2(5);
      Console.WriteLine("Value of Num: {0}",getNum());
      Console.ReadKey();
    }
  }
}

當上面的程式碼被編譯和執行時,它會產生下列結果:

Value of Num: 35
Value of Num: 175

以上就是例項講解C# 泛型(Generic)的詳細內容,更多關於C# 泛型(Generic)的資料請關注我們其它相關文章!