C# のメソッドグループ
- C# のメソッドグループ
-
C# の
デリゲート
-
C# の
DELEGATE
を使用したメソッドグループの変換 -
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
というメソッドがあり、そこから DASHBOARD
、WHEEL
、LIGHTS
などの他のいくつかのメソッドに対処するとします。便宜上、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
と呼びます。このシナリオでは、LIGHTS
、MIRRORS
、および CAR
はすべて同じメソッドグループの一部です。
C# のメソッドグループのシンプルなカスタムデリゲート
METHOD GROUPS
を指すことができる DELEGATE
を作成する簡単な方法は、次のように簡単です。
Func<string> f_test = "AA".ToString;
Console.WriteLine(f_test());
上記を呼び出すと、結果として文字列 AA
が出力されます。F_TEST
は ToString
メソッドを指し、それを呼び出します。
また、この関数が関数自体ではなく、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
のリターンタイプは INT
と 18
であるため、オーバーロードは異なります。文字列"435"
で F_TEST
を呼び出したいので、パラメータタイプを定義する必要があり、PARAM2
を STRING
として定義します。
関数のオーバーロードが 1つしかない場合でも、PARAM2
を定義することは重要です。METHOD GROUPS
はコンパイルされた時間構成であるため、単一のオーバーロードに対して選択する必要があります。PARAM2
に少なくとも 1つのオーバーロードが含まれていることを確認することが重要です。
関数で List.Select(MethodGroup)
を呼び出すときに、LINQ
のキャストを削除することもできます。この記事では METHOD GROUPS
に焦点を当てているため、LINQ
のコンテキストについては詳しく説明しません。
C# のメソッドグループに関数ポインタを使用する
デリゲートからさまざまな機能を指す必要があるのは、METHOD GROUPS
で作業している場合のみです。このような状況では、戻り値のタイプとパラメーターが一致していることを確認する必要があります。
C# には、さまざまな関数を指すことができるようにするための FUNC
キーワードが既に用意されています。オブジェクトと変数のアドレスをポイントしてそれらを呼び出すことによってポインターが機能するのと同じように、デリゲートも同じように想像できます。
ポインタは、アドレス指定するオブジェクトと同じリターンタイプを持つ傾向があります。デリゲートは、機能要件のためにパラメーターも処理する必要があります。
たとえば、関数を配列に格納し、コードに対して動的に呼び出す場合や、呼び出される他の関数に関数を渡す場合は、関数を指す必要があります。LAMBDA
関数も同じ要件を果たします。
ただし、METHOD GROUPS
は、基本的な戻り値とパラメータータイプに従うオーバーロードされた関数を持つ一般的なクラスターです。
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