C#のActionの使い方。Funcとの違いやデリゲートの解説

デリゲートを初めて聞いたという方も、ファンクション(Function)は何となく聞き覚えがあるのではないでしょうか。何となく「関数が関連するのかな?」と思った方、正解です。
この記事では、デリゲートの使い方やActionとFuncの違いについてご紹介しますので、ぜひ参考にしてみてください。
- プログラマー
- デリゲートを介して関数を呼び出して欲しいといわれたのですが、さっぱり分かりません。どのように実装すればよいのでしょうか?
- プロジェクト
リーダー - 関数の扱い方の前にまず、デリゲートについて理解していくところから始めてみようか。
実行環境
・Windows 10 Home
・Visual Studio Community 2019
C#のデリゲートとは?
C#のデリゲートとは、メソッドを参照できる関数ポインタのような型です。
デリゲート型は以下のような形式で定義します。
1
|
delegate [戻り値の型] [デリゲート名] ([引数1], [引数2] , …)
|
デリゲート型と同じ引数、戻り値となるメソッドであれば、デリゲート名に代入することができます。難しく考える前に、まずはサンプルコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
delegate string GetStr(string str, int len);
static void Main(string[] args)
{
string str = "This is a pen.";
int len = 4;
GetStr func = GetLeftStr; //★
Console.WriteLine($"左から{len}文字: {func(str, len)}");
func = GetRightStr; //★
Console.WriteLine($"右から{len}文字: {func(str, len)}");
}
static string GetLeftStr(string str, int len)
{
string ret = str.Substring(0, len);
return ret;
}
static string GetRightStr(string str, int len)
{
int startIndex = str.Length - len;
string ret = str.Substring(startIndex, len);
return ret;
}
// → 出力結果は以下となります。
// 左から4文字: This
// 右から4文字: pen.
|
デリゲート型と同じ引数、戻り値となるため、★の位置で、GetLeftStrメソッドとGetRightStrメソッドが代入できています。
設定されたメソッドに応じた結果(文字列)が出力されていることも確認できました。
Actionの使い方
先ほど紹介したデリゲートでは、デリゲート型で変数を宣言してからメソッドを代入していましたが、何も返さないメソッドの場合、Actionで定義できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
static void Main(string[] args)
{
Action show = ShowAction1;
show();
show = ShowAction2;
show();
}
static void ShowAction1()
{
Console.WriteLine("ShowAction1");
}
static void ShowAction2()
{
Console.WriteLine("ShowAction2");
}
// → 出力結果は以下となります。
// ShowAction1
// ShowAction2
|
デリゲート型の変数を明示的に宣言せず、Actionを使用してメソッドが呼び出せています。
FuncとActionの違い
Funcとは、デリゲートの宣言をシンプルにしたものと考えてください。引数は最大16個まで指定可能です。
1
|
Func<引数1の型, 引数2の型, …, 戻り値の型>
|
また、Actionも引数を与えることが可能ですが、FuncとActionの違いとしては、戻り値の有無となります。Actionでは戻り値がありません。
1
|
Action<引数1の型, 引数2の型, …>
|
それでは、前項で示したデリゲート型を使用したサンプルコードを、Funcに置き換えてみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
static void Main(string[] args)
{
string str = "This is a pen.";
int len = 4;
Func<string, int, string> func = GetLeftStr;
Console.WriteLine($"左から{len}文字: {func(str, len)}");
func = GetRightStr;
Console.WriteLine($"右から{len}文字: {func(str, len)}");
}
//※ GetLeftStr、GetRightStrの定義は変更なしのため省略
// → 出力結果は以下となります。
// 左から4文字: This
// 右から4文字: pen.
|
デリゲート型の変数を明示的に宣言せず、Funcを使用してメソッドが呼び出せています。
- プログラマー
- なるほど、関数の呼び出しはこのように実装するのですね!勉強になりました。今回はActionを使おうと思います。
- プロジェクト
リーダー - 理解してもらえたようで良かったです。デリゲートは難しいかもしれません。実際にコードを作成して、より理解を深めてみると良いでしょう。
ActionとFuncの違いを理解して使いこなそう
今回は、デリゲートの使い方やActionとFuncの違いを紹介しました。関数を変数のように扱えるイメージなので最初は戸惑うかもしれませんが、使いこなせば便利な機能になると思います。デリゲートの基本からこの機会に使い方を覚えて、これからのコーディングに生かしてみてください。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


C#新着案件New Job
-
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(新宿駅) -
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(新宿駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円神奈川県横浜市(桜木町駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円神奈川県横浜市(桜木町駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(西新宿駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(西新宿駅)