C# のメソッドグループ

Bilal Shahid 2023年10月12日
  1. C# のメソッドグループ
  2. C# のデリゲート
  3. C# の DELEGATE を使用したメソッドグループの変換
  4. C# のメソッドグループのシンプルなカスタムデリゲート
  5. C# のメソッドグループに関数ポインタを使用する
C# のメソッドグループ

この記事では、C# のメソッドグループに取り組みます。

C# のメソッドグループ

関数に複数の実装がある場合があります。まったく異なるパラメータセットまたはタイプを持つ別の定義がある場合や、通常はオーバーロードされた関数として知られています。

構文:

void print(int x) {
  ///...code
}

void print(int x, int y) {
  ///...code for x and y
}

このような関数またはメソッドは、メソッドグループと呼ばれます。

C# のデリゲート

DELEGATES は、作成された関数へのポインタです。関数を指すだけでなく、関数の戻りタイプとそのパラメーターも定義します。

たとえば、LAPTOP と呼ばれるデリゲートは、return タイプを void として、パラメーターを USERNAME(文字列)として持つことができます。PC と呼ばれる別の関数があります。これも LAPTOP と同じリターンタイプとパラメータータイプを持っています。

このシナリオでは、デリゲート LAPTOP から PC を呼び出すことができます。

コード例:

delegate void LAPTOP(string username);

static void PC(string username) {
  Console.WriteLine("USER: " + username + " has logged in!");
}

static void Main() {
  LAPTOP lap1 = PC;
  lap1("Hydrogen");
}

LAPTOP インスタンスを PC でインスタンス化し、後で呼び出すと、PC メソッドから渡されたユーザー名が出力されることがわかります。それが DELEGATES の仕組みです。

C# の DELEGATE を使用したメソッドグループの変換

メソッドグループの最も一般的な使用法の 1つと、呼び出されたときにそれらを処理する方法について説明します。メソッドグループが基本メソッドのオーバーロードされた関数である方法について説明しました。DELEGATES を使用すると、メソッドグループを必要に応じて使用できます。

この例では、CAR というメソッドがあり、そこから DASHBOARDWHEELLIGHTS などの他のいくつかのメソッドに対処するとします。便宜上、2つのメソッドのみを使用します。 ; ライトミラー

コード例:

delegate void CAR(bool start);

static void MIRROR(bool start) {
  if (start)
    Console.WriteLine("Mirror is now working!");
  else
    Console.WriteLine("Mirror is not stopped/closed");
}

static void LIGHTS(bool start) {
  if (start)
    Console.WriteLine("Lights are now working!");
  else
    Console.WriteLine("Lights have stopped/closed");
}

メソッドを定義したので、MAIN メソッドを実装しましょう。ここでは、デリゲートを使用してこれらのメソッドグループを処理します。

CAR car = MIRROR;
car(true);

car = LIGHTS;
car(false);

CAR オブジェクトが MIRROR を指していることに気付くでしょうが、後で LIGHTS を指すようになります。次に、メソッドを呼び出すと、それが指す関数が呼び出されます。

関数の名前は car オブジェクトに割り当てられます。グループ内の異なるメソッドを指すように DELEGATE ポインターを変更することを METHOD GROUP CONVERSION と呼びます。このシナリオでは、LIGHTSMIRRORS、および CAR はすべて同じメソッドグループの一部です。

C# のメソッドグループのシンプルなカスタムデリゲート

METHOD GROUPS を指すことができる DELEGATE を作成する簡単な方法は、次のように簡単です。

Func<string> f_test = "AA".ToString;
Console.WriteLine(f_test());

上記を呼び出すと、結果として文字列 AA が出力されます。F_TESTToString メソッドを指し、それを呼び出します。

また、この関数が関数自体ではなく、ToString メソッドのアドレスを指していることにも注意してください。これがポインタの仕組みです。

METHOD GROUPS を正しく理解するために、別の例を以下に示します。

Func<string, int> f_test = Convert.ToInt32;
Console.WriteLine(f_test("435"));

構文:

Func<param1, param2> name;
//param1 is the parameter passed in the function/method pointed to
//param 2 is the return type of that function/method that the delegate points to

Convert.ToInt32 のリターンタイプは INT18 であるため、オーバーロードは異なります。文字列"435"F_TEST を呼び出したいので、パラメータタイプを定義する必要があり、PARAM2STRING として定義します。

関数のオーバーロードが 1つしかない場合でも、PARAM2 を定義することは重要です。METHOD GROUPS はコンパイルされた時間構成であるため、単一のオーバーロードに対して選択する必要があります。PARAM2 に少なくとも 1つのオーバーロードが含まれていることを確認することが重要です。

関数で List.Select(MethodGroup) を呼び出すときに、LINQ のキャストを削除することもできます。この記事では METHOD GROUPS に焦点を当てているため、LINQ のコンテキストについては詳しく説明しません。

C# のメソッドグループに関数ポインタを使用する

デリゲートからさまざまな機能を指す必要があるのは、METHOD GROUPS で作業している場合のみです。このような状況では、戻り値のタイプとパラメーターが一致していることを確認する必要があります。

C# には、さまざまな関数を指すことができるようにするための FUNC キーワードが既に用意されています。オブジェクトと変数のアドレスをポイントしてそれらを呼び出すことによってポインターが機能するのと同じように、デリゲートも同じように想像できます。

ポインタは、アドレス指定するオブジェクトと同じリターンタイプを持つ傾向があります。デリゲートは、機能要件のためにパラメーターも処理する必要があります。

たとえば、関数を配列に格納し、コードに対して動的に呼び出す場合や、呼び出される他の関数に関数を渡す場合は、関数を指す必要があります。LAMBDA 関数も同じ要件を果たします。

ただし、METHOD GROUPS は、基本的な戻り値とパラメータータイプに従うオーバーロードされた関数を持つ一般的なクラスターです。

著者: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub

関連記事 - Csharp Method