C#のInvokeメソッドの基本と使い方の理解

この記事では、C#でよく登場するInvokeメソッドの基本から「なぜ使うのか」までを分かりやすく整理しています。

C#初心者の方や、静的言語にあまり触れてこなかった方にとっては馴染みの薄いメソッドかもしれません。

私自身もPHP歴が長く、最初は十分に理解できず困った経験があります。そのため、自分の理解の整理も兼ねてまとめてみました。

原理・仕組みをしっかり理解したい方にわかりやすく紹介しているのでそのような方におすすめです。

※自分も完璧に理解しているとは言えないのでもし間違い等ありましたら、ご指摘ください。

この記事を読むメリット

  • Invokeメソッドの基本的な仕組みが分かる
  • Invokeを使う理由やメリットが理解できる

Invokeメソッドを初めて見た

私はC#の経験がほとんどなく、実務で初めてInvokeメソッドを見たときは戸惑いました。

以下のような形で実装されているコードをみました。

void ProcessWithLogging(string fileName, Action<string> action)
{
    Console.WriteLine($"[{fileName}] 処理開始");
    action.Invoke(fileName); 
    Console.WriteLine($"[{fileName}] 処理終了");
}

呼び出し側でのコードはこんな感じ。

ProcessWithLogging("report.pdf", (file) => {
    // アップロード処理
    Console.WriteLine($"{file} をアップロードします");
    UploadFile(file);
});

軽く調べてみると、「関数を引数として渡す」ことで呼び出しがわで柔軟に実装ができるためにInvokeを使うということでした。

概要は分かったものの、「引数で渡さず普通に関数を分ければよいのでは?」とも思い、Invokeを使う意味をしっかり理解したいと感じました。

使うことによるメリットを理解した上で自分のものにして実際に使えるようになりたいと思い詳しく調べてみました。

Invokeメソッドの基本

まずはInvokeメソッドの基本からです。

C#は、関数を引数として受け取ることができます。

その際引数としてdelegate型やAction、Funcなどを受け取ることができます。

void Execute(Action action)
{
    Console.WriteLine("処理前");
    action.Invoke(); // 渡された関数を実行
    Console.WriteLine("処理後");
}

このとき Invoke() を呼び出すことで、引数として渡された関数を実行できます。

渡ってくる関数に引数がある場合も対応できます。

void ProcessWithLogging(string fileName, Action<string> action)
{
    Console.WriteLine($"[{fileName}] 処理開始");
    action.Invoke(fileName); 
    Console.WriteLine($"[{fileName}] 処理終了");
}

なぜInvokeを使うのか

ここからは、なぜInvokeを使うのか、Invokeを使うことによるメリットを紹介したいと思います。

  • 共通処理の外枠(トランザクション、ロギング、ロック処理など)を1か所にまとめられる
  • 中身の処理を柔軟に差し替え可能 → 拡張性・保守性が高くなる
  • 呼び出し側が「何をしたいか」に集中でき、共通部分は抽象化できる

呼び出し側は 実装したい処理だけに集中でき、共通処理は抽象化できる という点が、Invokeを使う最大のメリットだと感じています。

処理の型だけを決めて具体的な実装部分は抽象化して呼び出し側に委譲するすることができます。

関数呼び出しとの違い

当初持っていた関数の呼び出しとあまり変わらないのでは疑問に対しての自分なりの違いは以下のようになります。

観点関数化だけ関数を引数で渡す(+ Invoke)
再利用性低め高い(共通枠を汎用化できる)
柔軟性固定処理向き可変処理に対応
呼び出し側が定義できる範囲固定柔軟に定義可能
実装の自由度限定的関数型的な構造も可能

可変部分だけを引数で渡して、共通処理を抽象化するという考え方が、普通の関数呼び出しとの大きな違いだと言えます。

抽象化する共通処理がケースによって異なる場合、例えばテスト用のモック処理なども行うことができます。

まとめ

いかがだったでしょうか。

Invokeメソッドの基本は理解できたのではないかと思います。

曖昧なままだと、次に目にしたときも再度理解し直す必要が出てきますし、コードを書く際の選択肢にも上がってきません。今回の整理で理解が深まり、とても良い機会になりました。

「なぜこんなメソッドがあるのか」、「他の似たようなものとの違いは何なのか」といった疑問を持ちながらだと具体的なユースケースなどがイメージしやすくて深い理解に繋がりやすいと思います。

ぜひ参考にしてみてください。

同じカテゴリーの新着記事

カテゴリー情報が取得できませんでした。

Recruit

Contact