要するに関数型の変数の宣言。 private delegate void func(string a); で、func という型が定義されて、func a という変数 a は、『引数が string 型で、戻り値が無い』という定義がされているメソッドであればなんでも良いという事。 メソッドを代入された変数はそのメソッドの代用になり、そのままメソッドとして使用できるようになるが、変数なので、内容を変更もできるし(他のメソッドとして入れ替え可能)、引数にも使用できる。( もちろん最初のメソッド名も引数として渡せるが、変数では無いので中身を変更はできない )
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Diagnostics; namespace WindowsFormsApplication1 { public partial class Form1 : Form { // ▼ 宣言 private delegate void func(string a); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // ▼ 呼び出しタイプ1( 特定メソッド型変数にメソッド名を代入 ) func _ptr = debug_string; button_action(_ptr); // ▼ 呼び出しタイプ2( 古い方法 ) button_action(new func(debug_string)); // ▼ 匿名処理1( ラムダ式 ) : button_action 内より呼び出される button_action((string a) => { Debug.WriteLine(a); }); // ▼ 匿名処理2: button_action 内より呼び出される button_action(delegate(string a) { Debug.WriteLine(a); }); } private void button_action(func ptr) { // 変数を使ってメソッドを呼び出す // ( 呼び出しタイプ1と2では debug_string が呼び出される ) // ( 匿名処理1と2では そこに書いた別々のコードが呼び出される ) ptr("デバッグを呼び出す"); } private void debug_string(string a) { Debug.WriteLine(a); } } }
※ 呼び出しタイプ2/匿名処理1/匿名処理2 方法 : デリゲートを宣言し、インスタンス化して使用する リンク先によると、『new func(debug_string)』は一番古い書き方で、その次に『debug_string』というメソッド名を直接セットするようになっていますが、さらに『delegate』を使って匿名の処理をその場で書く事ができるようになっています。 そしてさらに最新の書き方が『ラムダ式』で、 (引数) => {処理;処理;} というような書き方が可能になっています。 ラムダ式 (C# プログラミング ガイド)
|
【C#の最新記事】
- C# : PHP と連携してバイナリデータを WebClient.UploadDataAsync でそのままアップロードする
- C# : WebClient で JSON データを取得後 Json.NET でオブジェクト化( ついでに PropertyInfo でプロパティデータ一覧を foreach で取得 )
- C# : Microsoft Access の接続で、他の RDBMS( ここでは MySQL ) にエクスポートを行う
- C# : TKMP.DLLを使った、Gmail 用メール送信テンプレート
- C# : DataGridView を使用したナチュラルな行データの更新
- PowerShell 移行用 C# コンソールアプリのコードテスト( ZIP 圧縮 )
- 解く事が目的では無い、身に付ける事が目的の C# 初心者用の問題を作ったので良かったらどうぞ (4)
- 解く事が目的では無い、身に付ける事が目的の C# 初心者用の問題を作ったので良かったらどうぞ (3)
- 解く事が目的では無い、身に付ける事が目的の C# 初心者用の問題を作ったので良かったらどうぞ (2)
- 解く事が目的では無い、身に付ける事が目的の C# 初心者用の問題を作ったので良かったらどうぞ (1)
- ComboBox : C# : Form アプリケーションで良く使うコントロール / VS2012 にて
- C# バッチビルドキットで、VB の My 名前空間を使ってクリップボードを使ったり、キーボードの SHIFT キーが押されているかを知る
- printui.dll を VB.net または C# から呼び出す/ DllImport で LoadLibraryA / VS2010
- LINQ で List
のソート - VS2010(C#)WPF : ListView 内に GridView を配置する
- Windows ストア用の System.Collections.Generic 名前空間には、SortedList はありません。
- 情報が全くみつからない Microsoft.Live
- VS2010(C#) バッチ(コンソールアプリ) Twitter 投稿
- Windows8(C#) の WebView の LoadComplete で取得した URL 内のアクセストークンを Split で取得
- Facebook C# SDK の 5.4.1.0 のダウンロード