C#の匿名メソッド(Anonymous Method)とは?基本構文と実装例をわかりやすく解説
C#における匿名メソッド(Anonymous Method)は、名前を持たないメソッド本体だけのコードブロックを、デリゲートのパラメータとして直接渡すための手法です。簡単な処理をその場で定義したい場合に便利で、わざわざ別途メソッドを宣言する必要がありません。
匿名メソッドの宣言方法
匿名メソッドは、delegateキーワードを使って次のように宣言します。
delegate void NumberChanger(int n);
...
NumberChanger nc = delegate(int x) {
Console.WriteLine("Anonymous Method: {0}", x);
};この例では、int型の引数を受け取る匿名メソッドを作成し、NumberChanger型のデリゲート変数ncに代入しています。
実装例
以下は、C#で匿名メソッドを実装する完全なサンプルプログラムです。匿名メソッドと通常の名前付きメソッドの両方でデリゲートを利用しています。
using System;
delegate void NumberChanger(int n);
namespace DelegateAppl {
class Demo {
static int num = 10;
public static void AddNum(int p) {
num += p;
Console.WriteLine("Named Method: {0}", num);
}
public static void MultNum(int q) {
num *= q;
Console.WriteLine("Named Method: {0}", num);
}
public static int getNum() {
return num;
}
static void Main(string[] args) {
// 匿名メソッドを使ってデリゲートインスタンスを作成
NumberChanger nc = delegate(int x) {
Console.WriteLine("Anonymous Method: {0}", x);
};
// 匿名メソッド経由でデリゲートを呼び出す
nc(10);
// 名前付きメソッドでデリゲートをインスタンス化
nc = new NumberChanger(AddNum);
// 名前付きメソッド経由でデリゲートを呼び出す
nc(5);
// 別の名前付きメソッドでデリゲートを再設定
nc = new NumberChanger(MultNum);
// 名前付きメソッド経由でデリゲートを呼び出す
nc(2);
Console.ReadKey();
}
}
}実行結果
このプログラムをコンパイルして実行すると、以下の出力が得られます。
Anonymous Method: 10 Named Method: 15 Named Method: 30
補足:匿名メソッドとラムダ式
なお、C# 3.0以降では匿名メソッドよりも簡潔に記述できるラムダ式が一般的に使われています。上記の匿名メソッドは、ラムダ式を使えば(x) => { Console.WriteLine("Lambda: {0}", x); }のように書けます。ただし、匿名メソッドはパラメータを省略できるなど、ラムダ式にはない特徴もあるため、レガシーコードの読解や特定の場面では依然として有用です。
-
JavaScriptのオブジェクトメソッドとは?使い方とサンプルコードを解説
JavaScriptにおけるオブジェクトメソッドとは、オブジェクトに対して実行できる操作(アクション)のことです。オブジェクトは文字列や数値などのデータ(プロパティ)だけでなく、関数を値として持つことができ、この関数が「メソッド」として機能します。メソッド内では this キーワードを使用することで、そのオブジェクト自身が持つプロパティへアクセスできます。これは、オブジェクト指向プログラミングにおいて非常に重要な概念です。オブジェクトメソッドのサンプルコード以下は、ユーザーの入力した名前と年齢から、成人かどうかを判定するメソッドを持つオブジェクトを作成する例です。<!DOCTYPE ht
-
JavaScriptでプロトタイプを使ってメソッドを共有する方法
JavaScriptにおけるメソッドの共有JavaScriptでは、メソッドをオブジェクト(コンストラクタ関数)のprototypeプロパティに定義することで、複数のインスタンス間でそのメソッドを共有できます。通常、コンストラクタ内でthis.displayInfo = function(){...}のようにメソッドを定義すると、生成されるインスタンスごとに関数のコピーが作成され、メモリを無駄に消費します。一方、prototypeに定義すれば、関数は一度だけ生成され、すべてのインスタンスから参照・呼び出しできるようになります。これはメモリ効率の面でも大きなメリットがあります。以下は、JavaS