首頁  >  文章  >  後端開發  >  解釋泛型在 C# 中的工作原理

解釋泛型在 C# 中的工作原理

WBOY
WBOY轉載
2023-08-27 23:45:021003瀏覽

解释泛型在 C# 中的工作原理

泛型是在 C# 2.0 版本中新增的,是該語言中最重要的概念之一。它們使您能夠編寫在編譯時類型安全的可重複使用、高效能程式碼。使用泛型,您可以在程式碼中使用某種類型,而無需事先了解該類型。

泛型在 .NET 中的許多地方使用,包括集合、委託和非同步程式碼。使用泛型,您不需要事先知道集合的大小,並且可以將泛型與任何元素類型一起使用,甚至是特定於您的程式碼的自訂資料類型。 C# 提供對泛型類型(類別、介面等)和泛型方法的支援。

在泛型中,您有型別參數和型別參數。這類似於具有參數的方法,您可以將參數傳遞給該方法。

泛型類型

宣告泛型類型的語法由位於尖括號中的型別參數所組成。類型的名稱。例如,Locator 是下面範例中的泛型類別。

public class Locator<T>
{

}

要建立 Locator 的實例,請使用 new 關鍵字,後面跟著類別的名稱。但是,您可以指定要作為參數傳遞的實際類型,而不是 T。以下範例將字串類型作為參數傳遞。

var stringLocator = new Locator<string>();

您可以在類別方法上使用類型參數 (T),如下例所示。

public class Locator{
   public IList Items { get; set; }

      public T Locate(int index){
      return Items[index];
   }
}
var stringLocator = new Locator<string>();
string item = stringLocator.Locate(2);

泛型的另一個好處是編輯器提供的 IntelliSense。當您在 Visual Studio 或 VS Code 中鍵入 stringLocator.Locate(4) 並將滑鼠懸停在方法名稱上時;它會顯示它傳回一個字串而不是 T。如果您嘗試將結果指派給字串以外的任何類型,編譯器將引發錯誤。例如,

// Error: Cannot implicitly convert type &#39;string&#39; to &#39;int&#39; [c-sharp]csharp(CS0029)
int item = stringLocator.Locate(2);

從泛型基底型別或泛型介面繼承時,泛型型別可以使用型別形參作為型別實參。通用 LinkedList 類型實作通用 IEnumerable 介面以及其他介面。

public class LinkedList<T> : IEnumerable<T>

泛型方法

泛型方法只是宣告類型參數的方法,您可以在方法內部使用該類型參數並將其用作參數和傳回類型。在下面的範例中,Swap 是一個泛型方法,它採用兩個 T 類型的參數並傳回 T 的實例。

public class Swapper{
   public T Swap<T>(T first, T second){
      T temp = first;
      first = second;
      second = temp;
      return temp;
   }
}

與泛型類型一樣,當您呼叫泛型方法時,它將傳回一個強類型變數。

var swapper = new Swapper();
int result = swapper.Swap<int>(5, 3);

可以有多個通用參數。 System.Collections.Generic 命名空間中的 Dictionary 類別有兩個類型參數,即鍵和值。

public class Dictionary<TKey, TValue>

最後,了解什麼是通用的很重要。對於型別來說,除了列舉之外,一切都可以是泛型的。其中包括-

  • 類別
  • 結構
  • 介面
  • #委託

對於類型成員,只有方法和巢狀類型可以是泛型的。下列成員不能是通用的-

  • 欄位
  • #屬性
  • 索引器
  • ##建構子
  • ##事件 li>
  • #終結器
  • 範例

 現場示範

using System;
using System.Collections.Generic;
class Program{
   static void Main(){
      var stringLocator = new Locator<string>(){
         Items = new string[] { "JavaScript", "CSharp", "Golang" }
      };
      string item = stringLocator.Locate(1);
      Console.WriteLine(item); // CSharp
      var swapper = new Swapper();
      int a = 5, b = 3;
      int result = swapper.Swap<int>(ref a, ref b);
      Console.WriteLine($"a = {a}, b = {b}");
   }
}
public class Locator<T>{
   public IList<T> Items { get; set; }
   public T Locate(int index){
      return Items[index];
   }
}
public class Swapper{
   public T Swap<T>(ref T first, ref T second){
      T temp = first;
      first = second;
      second = temp;
      return temp;
   }
}

輸出

CSharp
a = 3, b = 5

以上是解釋泛型在 C# 中的工作原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除