ホームページ  >  記事  >  バックエンド開発  >  C# でジェネリックスがどのように機能するかを説明する

C# でジェネリックスがどのように機能するかを説明する

WBOY
WBOY転載
2023-08-27 23:45:021003ブラウズ

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

ジェネリックは C# バージョン 2.0 で追加され、言語の最も重要な概念の 1 つです。これらを使用すると、コンパイル時にタイプセーフで、再利用可能でパフォーマンスの高いコードを作成できます。ジェネリックを使用すると、型を事前に知らなくてもコード内で型を使用できます。

ジェネリックは、コレクション、デリゲート、非同期コードなど、.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);

ジェネリックのもう 1 つの利点は、エディターが提供する 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 の 2 つのパラメーターを受け取り、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 クラスには、キーと値という 2 つの型パラメーターがあります。

public class Dictionary<TKey, TValue>

最後に、何が普遍的であるかを理解することが重要です。型の場合、列挙型を除くすべてをジェネリックにすることができます。これらには、-

  • Class
  • Structure
  • Interface
  • Delegate

型メンバーの場合はメソッドとのみが含まれます。ネストされた型はジェネリックにすることができます。次のメンバーは一般的なものにはできません -

  • Fields
  • Properties
  • Indexer
  • Constructor li>
  • Event
  • ターミネーター

ライブ デモンストレーション

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はtutorialspoint.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。