C#のFuncデリゲートとActionデリゲートの違いとは?使い方をコード例付きで解説
デリゲート(delegate)とは、特定のパラメータリストと戻り値の型を持つメソッドへの参照を表す型です。デリゲートをインスタンス化すると、互換性のあるシグネチャと戻り値の型を持つ任意のメソッドとそのインスタンスを関連付けられ、デリゲートのインスタンスを通じてそのメソッドを呼び出すことができます。
Funcデリゲートとは
Funcは、System名前空間に含まれる汎用デリゲートです。0個以上の入力パラメータと1つの出力パラメータ(戻り値)を持ち、最後の型引数が戻り値の型として扱われます。このデリゲートは、最大16個のパラメータを受け取り、値を返すメソッドを参照できます。
以下は、2つの入力パラメータと1つの戻り値を持つFuncデリゲートの宣言例です。
Func<string, string, string> Append;
コード例
using System;
namespace DemoApplication {
class Program {
static void Main(string[] args) {
Func<string, string, string> func = Append;
string fullName = func("Michael", "Jackson");
Console.WriteLine(fullName);
Console.ReadLine();
}
static string Append(string firstName, string lastName) {
return firstName + lastName;
}
}
}
実行結果
MichaelJackson
Actionデリゲートとは
Actionは、System名前空間で定義されているデリゲート型です。Funcデリゲートとよく似ていますが、戻り値を返さない点が大きな違いです。つまり、Actionデリゲートは戻り値の型がvoidのメソッドに対して使用します。入力パラメータは最大16個まで指定でき、出力パラメータ(戻り値)は持ちません。
以下は、2つの入力パラメータを持つActionデリゲートの宣言例です。
Action<string, string> Print;
コード例
using System;
namespace DemoApplication {
class Program {
static void Main(string[] args) {
Action<string, string> action = AppendPrint;
action("Michael", "Jackson");
Console.ReadLine();
}
static void AppendPrint(string firstName, string lastName) {
string fullName = firstName + lastName;
Console.WriteLine($"{fullName}");
}
}
}
実行結果
上記のコードを実行すると、次のように出力されます。
MichaelJackson
FuncとActionの違いまとめ
| 項目 | Func | Action |
|---|---|---|
| 戻り値 | あり(最後の型引数が戻り値) | なし(void相当) |
| 入力パラメータ | 0〜16個 | 0〜16個 |
| 主な用途 | 値を返す処理(計算・変換など) | 値を返さない処理(表示・ログ出力など) |
このように、処理結果を値として受け取りたい場合はFunc、単に処理を実行するだけでよい場合はActionを使い分けるのが基本です。ラムダ式やLINQと組み合わせる場面も多いため、両者の違いをしっかり理解しておきましょう。
-
C#におけるstringとStringの違いは何ですか?
C#のstringとStringの違いC#プログラミングにおいて、stringとStringはどちらも同じ型を指しますが、その扱いには微妙な違いがあります。Stringは.NET FrameworkのクラスであるSystem.Stringを直接表すものであり、一方、stringはC#言語が用意しているSystem.Stringのエイリアス(別名)です。つまり、両者はコンパイル後にまったく同じものとして扱われます。基本的な使い方の例string str = Welcome!;このように文字列変数を宣言する際は、通常小文字のstringを使用します。使い分けの目安厳密なルールはありませんが、一般的
-
Pythonの文字列(str)とバイト文字列(bytes)の違いをわかりやすく解説
文字列とバイト文字列の基本的な違いPythonにおける文字列(str)は「文字」の並びであり、これは抽象的な概念です。そのため、そのままではディスクに保存することができません。一方、バイト文字列(bytes)は「バイト」の並びであり、実際にディスクへ保存できるデータです。この両者をつなぐのがエンコーディング(符号化方式)です。エンコーディングには非常に多くの種類があり(理論上は無限に存在します)、変換を行う際にはどのエンコーディングが使われているのかを正しく把握しておく必要があります。なぜエンコーディングの指定が重要なのか同じバイト列でも、解釈するエンコーディングが異なれば、まったく別の文字列