C#の匿名メソッドとは?基本構文と実行例つきでわかりやすく解説
C#では、匿名メソッド(Anonymous Method)を利用することで、名前を持たないコードブロック(処理本体のみ)をデリゲートのパラメータとして直接渡すことができます。匿名メソッドは、その名の通り「メソッド名を持たず、本体だけが存在する」メソッドであり、C# 2.0から導入された機能です。短い処理をその場で記述したい場合などに便利です。
匿名メソッドの宣言方法
匿名メソッドは、delegate キーワードを使って次のように宣言します。
delegate void DemoMethod(int n);
...
DemoMethod dm = delegate(int a) {
Console.WriteLine("Our Anonymous Method: {0}", a);
};上記のコードにおいて、以下の部分が匿名メソッドの本体(実際の処理内容)に相当します。
Console.WriteLine("Our Anonymous Method: {0}", a);匿名メソッドの実装例
次のサンプルコードは、匿名メソッドと名前付きメソッドの両方を同じデリゲート変数に割り当てて呼び出す例です。実際に実行して、それぞれの出力の違いを確認してみてください。
using System;
delegate void Demo(int n);
namespace MyDelegate {
class TestDelegate {
static int num = 10;
public static void DisplayAdd(int p) {
num += p;
Console.WriteLine("Named Method: {0}", num);
}
public static void DisplayMult(int q) {
num *= q;
Console.WriteLine("Named Method: {0}", num);
}
public static int getNum() {
return num;
}
static void Main(string[] args) {
Demo dm = delegate(int x) {
Console.WriteLine("Anonymous Method: {0}", x);
};
// 匿名メソッドを使ってデリゲートを呼び出す
dm(15);
// 名前付きメソッドでデリゲートをインスタンス化
dm = new Demo(DisplayAdd);
// 名前付きメソッドを使ってデリゲートを呼び出す
dm(10);
// 別の名前付きメソッドでデリゲートを再設定
dm = new Demo(DisplayMult);
// 名前付きメソッドを使ってデリゲートを呼び出す
dm(4);
Console.ReadKey();
}
}
}実行結果
Anonymous Method: 15 Named Method: 20 Named Method: 80
まず匿名メソッドが 15 を出力し、続いて加算を行う名前付きメソッド DisplayAdd が 20 を、乗算を行う DisplayMult が 80 を出力しています。このように、1つのデリゲート変数に対して、匿名メソッドでも名前付きメソッドでも柔軟に処理を割り当てられることが分かります。
まとめ
匿名メソッドを使えば、デリゲートに直接コードブロックを割り当てることができ、単純な処理を簡潔に記述できます。なお、C# 3.0以降ではさらに簡潔に書けるラムダ式が主流となっていますが、匿名メソッドの仕組みを理解しておくことは、デリゲートやラムダ式への理解を深めるうえで役立ちます。
-
JavaScriptのオブジェクトメソッドとは?使い方とサンプルコードを解説
JavaScriptにおけるオブジェクトメソッドとは、オブジェクトに対して実行できる操作(アクション)のことです。オブジェクトは文字列や数値などのデータ(プロパティ)だけでなく、関数を値として持つことができ、この関数が「メソッド」として機能します。メソッド内では this キーワードを使用することで、そのオブジェクト自身が持つプロパティへアクセスできます。これは、オブジェクト指向プログラミングにおいて非常に重要な概念です。オブジェクトメソッドのサンプルコード以下は、ユーザーの入力した名前と年齢から、成人かどうかを判定するメソッドを持つオブジェクトを作成する例です。<!DOCTYPE ht
-
JavaScriptでプロトタイプを使ってメソッドを共有する方法
JavaScriptにおけるメソッドの共有JavaScriptでは、メソッドをオブジェクト(コンストラクタ関数)のprototypeプロパティに定義することで、複数のインスタンス間でそのメソッドを共有できます。通常、コンストラクタ内でthis.displayInfo = function(){...}のようにメソッドを定義すると、生成されるインスタンスごとに関数のコピーが作成され、メモリを無駄に消費します。一方、prototypeに定義すれば、関数は一度だけ生成され、すべてのインスタンスから参照・呼び出しできるようになります。これはメモリ効率の面でも大きなメリットがあります。以下は、JavaS