C#
 Computer >> コンピューター >  >> プログラミング >> C#

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


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

ジェネリックスは、コレクション、デリゲート、非同期コードなど、.NETの多くの場所で使用されています。ジェネリックスを使用すると、コレクションのサイズを事前に知る必要がなく、コードに固有のカスタムデータ型を含め、任意の要素タイプでジェネリックスを使用できます。 C#は、ジェネリック型(クラス、インターフェイスなど)とジェネリックメソッドの両方をサポートします。

ジェネリックスには、型パラメーターと型引数があります。これはパラメータを持つメソッドに似ており、メソッドに引数を渡します。

ジェネリック型

ジェネリック型を宣言する構文は、型の名前の後に山かっこで囲まれた型パラメーターで構成されます。たとえば、Locatorは次の例のジェネリッククラスです。

public class Locator<T>
{

}

Locator のインスタンスを作成するには、newキーワードに続けて、クラスの名前を使用します。ただし、Tの代わりに、引数として渡す実際の型を指定します。次の例では、文字列型を引数として渡します。

var stringLocator = new Locator<string>();

次の例に示すように、クラスメソッドで型パラメータ(T)を使用できます。

public class Locator<T>{
   public IList<T> Items { get; set; }

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

ジェネリックスの追加の利点は、エディターによって提供されるIntelliSenseです。 StringLocator.Locate(4)をVisualStudioまたはVSCodeに入力し、メソッド名にカーソルを合わせると、 Tの代わりに文字列を返すことが示されます。結果を文字列以外のタイプに割り当てようとすると、コンパイラはエラーを発生させます。たとえば、

// Error: Cannot implicitly convert type 'string' to 'int' [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>

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

が含まれます
  • クラス
  • 構造体
  • インターフェース
  • 委任

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

  • フィールド
  • プロパティ
  • インデクサー
  • コンストラクター
  • イベント
  • ファイナライザー

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

  1. Windows10でファイルタイプを変更する方法

    MP3、ZIP、PDFなどのファイルを指す場合、オペレーティングシステムがファイルの種類と、ファイルを開くために必要なソフトウェアを識別できるようにするファイルの種類(またはファイル拡張子)を指します。これは、WindowsまたはmacOSが、音楽プレーヤーでMP3ファイルを開く必要があるか、PDFリーダーでPDFを開く必要があるかを判断する方法です。 ファイルのファイルタイプが間違っていると、Windowsは間違ったプログラムを使用してファイルを開きます。これにより、エラーが発生し、ファイルにアクセスできなくなる可能性があります。結局のところ、MicrosoftWordはMP3を処理できま

  2. PC で NAT タイプを変更する方法

    21st 世紀、高速インターネット接続へのアクセスが前提条件です。人々は何百ドルも費やしてプランや機器をアップグレードし、インターネットの速度が遅れないようにしています。ただし、最善の努力にもかかわらず、多くのユーザーはネット速度の低下の原因を突き止めようとして頭を悩ませています。これが問題のように思われ、ネットワーク接続を強化できない場合は、PC の NAT タイプを変更してください。 PC で NAT タイプを変更する方法 NAT とは? 誰もがネットサーフィンを楽しんでいますが、インターネット接続を可能にするバックグラウンドで実行されている何百ものプロセスに気付いている人はご