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

C#でのデリゲートの概念を説明する


Cプログラマーの場合、デリゲートは関数へのポインターと考えることができます。ただし、C#のデリゲートは、単なる関数ポインターではありません。この記事では、デリゲートの概念と日常のプログラミングでのその使用について説明します。

基本的に、デリゲートはあるレベルの間接参照を提供します。これらは、タイプセーフな方法で受け渡して実行できるコードをカプセル化します。ビヘイビアーをすぐに実行する代わりに、オブジェクトに含まれます。そのオブジェクトに対して実行できるアクションは複数あり、そのうちの1つが含まれている動作を実行しています。

デリゲートを使用すると、高階関数、つまり関数をパラメーターとして受け取ったり、関数を戻り値として返すことができる関数を記述できます。デリゲート型は、デリゲートが表すことができるメソッドシグネチャ、具体的にはメソッドの戻り型とそのパラメータ型を定義します。次の例では、Transformerは、整数を受け入れて返す任意のメソッドを表すことができるデリゲートです。

delegate int Transformer(int x);

シグニチャを満たすTransformerのインスタンスには、任意のメソッド(ラムダ、インスタンス、静的メソッドを含む)を割り当てることができます。例-

Transformer square = x => x * x;
Transformer cube = x => x * x * x;

Console.WriteLine(square(3)); // prints 9
Console.WriteLine(cube(5)); // prints 125

デリゲートを使用するのはいつですか?

デリゲートは通常、いくつかのアクションを実行したいコードがそれらのアクションの詳細を知らないが、それらのアクションのインターフェースを知っている場合に使用されます。

プログラミングでは、特定のアクションを実行する必要がある状況に直面することがよくありますが、それを実行するためにどのメソッドを呼び出すかは事前にわかりません。デリゲートは、その動作をデリゲートに置き換え、コンテキストと状況に応じて適切な動作でそのデリゲートの具体的なインスタンスを渡すことにより、この問題の解決に役立ちます。

代理人が何かをするためには、4つのことが起こる必要があります-

1)デリゲートタイプを宣言する必要があります。

デリゲート型は、基本的に、それが表す関数の定義です。つまり、関数が受け入れるパラメータ型と、関数が返す戻り型で構成されます。

たとえば、2つの数値を入力として受け取り、数値を返すメソッドを表すデリゲート型は、-

として宣言できます。
delegate int Processor(int numOne, int numTwo);

プロセッサは、クラスによって作成されたタイプに似たタイプです。このタイプのインスタンスを作成するには、入力として2つの数値を受け取り、ブール値を返すメソッドが必要です。

2)実行するコードはメソッドに含まれている必要があります。

上記のデリゲートタイプとまったく同じシグニチャを持ち、実行時の状況に応じて必要な処理を実行するメソッドを定義します。たとえば、次のいずれかのメソッドを使用して、Processorのインスタンスを作成できます。これらはすべて、2つの数値を受け取り、数値を返すためです。

static int Add(int numOne, int numTwo){
   Return numOne + numTwo;
}
static int Subtract(int numOne, int numTwo){
   Return numOne - numTwo;
}

3)デリゲートインスタンスを作成する必要があります。

デリゲート型と適切な署名を持つメソッドができたので、そのデリゲート型のインスタンスを作成できます。これを行う際には、基本的に、デリゲートインスタンスが呼び出されたときにこのメソッドを実行するようにC#コンパイラに指示しています。

Processor processorOne = new Processor(Add);
Processor processorTwo = new Processor(Subtract);

上記の例では、AddメソッドとSubtractメソッドが、デリゲートのインスタンスを作成しているのと同じクラスで定義されていることを前提としています。メソッドが別のクラスで定義されている場合は、そのクラスのインスタンスが必要になります。

4)デリゲートインスタンスを呼び出す必要があります。

これは、当然のことながら、Invokeという名前のデリゲートインスタンスでメソッドを呼び出すだけの問題です。デリゲートインスタンスのこのメソッドには、デリゲート型宣言で指定されているものと同じパラメーターと戻り型のリストがあります。 Invokeを呼び出すと、デリゲートインスタンスのアクションが実行されます。

int sum = processorOne.Invoke(3, 5);

ただし、C#を使用するとさらに簡単になります。デリゲートインスタンスは、それ自体がメソッドであるかのように直接呼び出すことができます。たとえば、

int difference = processorTwo(10, 6);

代理人の結合と削除

デリゲートインスタンスを1回呼び出すだけでさまざまなアクションのリストを実行する場合は、C#で実行できます。システム。デリゲート型には、CombineとRemoveという2つの静的メソッドがあります。

1。組み合わせる

パラメータとして渡されたデリゲートの呼び出しリストを連結する呼び出しリストを使用して、新しいデリゲートを作成します。新しいデリゲートインスタンスが呼び出されると、そのすべてのアクションが順番に実行されます。

public static Delegate Combine(params Delegate[] delegates); // OR
public static Delegate Combine(Delegate a, Delegate b);

呼び出しリスト内のアクションのいずれかが例外をスローすると、後続のアクションの実行が妨げられます。

2。削除

別のデリゲートの呼び出しリストから、デリゲートの呼び出しリストの最後のオカレンスを削除します。ソースの呼び出しリストを取得し、値の呼び出しリストの最後のオカレンスを削除することによって形成された呼び出しリストを持つ新しいデリゲートを返します。

public static Delegate Remove(Delegate source, Delegate value);

概要

  • デリゲートは、単一メソッドのインターフェースと同様に、特定のタイプとパラメーターのセットを使用して動作をカプセル化します。

  • デリゲート型宣言によって記述された型シグネチャは、デリゲートインスタンスの作成に使用できるメソッドと呼び出し用のシグネチャを決定します。

  • デリゲートインスタンスを作成するには、デリゲートが呼び出されたときに実行するメソッドが必要です。

  • デリゲートインスタンスは、文字列と同様に不変です。

  • デリゲートインスタンスにはそれぞれ、呼び出しリスト(アクションのリスト)が含まれています。

  • デリゲートインスタンスは、相互に組み合わせたり、削除したりできます。

using System;
class Program{
   delegate int Transformer(int x);
   delegate int Processor(int numOne, int numTwo);
   static void Main(){
      Transformer square = x => x * x;
      Transformer cube = x => x * x * x;
      Console.WriteLine(square(3)); // prints 9
      Console.WriteLine(cube(5)); // prints 125
      Processor processorOne = new Processor(Add);
      Processor processorTwo = new Processor(Subtract);
      int sum = processorOne.Invoke(3, 5);
      Console.WriteLine(sum); // prints 8
      int difference = processorTwo(10, 6);
      Console.WriteLine(difference); // prints 4
   }
   static int Add(int numOne, int numTwo){
      return numOne + numTwo;
   }
   static int Subtract(int numOne, int numTwo){
      return numOne - numTwo;
   }
}

出力

9
125
8
4

  1. C言語でのポインタアクセスの概念を説明する

    ポインタは、他の変数のアドレスを格納する変数です。 ポインタの宣言、初期化、アクセス 次のステートメントを検討してください- int qty = 179; ポインタの宣言 int *p; 「p」は、別の整数変数のアドレスを保持するポインタ変数です。 ポインタの初期化 アドレス演算子(&)は、ポインタ変数を初期化するために使用されます。 int qty = 175; int *p; p= &qty; 文字列の配列内の要素にアクセスする際にポインタがどのように役立つかの例を考えてみましょう。 このプログラムでは、特定の場所に存在する要素にアクセスしようとしています。操

  2. C#でクラスの概念を説明する

    クラスは、C#の必須タイプの1つです。クラスは、問題のドメインに関連するオブジェクトの青写真と考えることができます。これは、オブジェクトを作成するためのテンプレートであり、このクラスから作成されたオブジェクトのセットによって共有される構造と動作を定義します。簡単に言うと、クラスはCookieカッターであり、オブジェクトはCookie自体です。 クラスは、オブジェクト指向プログラミングの重要な概念であるカプセル化も可能にします。これは、データとデータを処理する操作を1か所で組み合わせ、そのオブジェクトのユーザーにシンプルなAPIを提供することを意味します。クラスを使用すると、データをカプセル化