今日はC#にあるデリゲートについて語るとします。
・デリゲートとは?
簡単に言えばC / C++の関数ポインタみたいなもんですね。でも同じではないので要注意!
関数ポインタなんだよって奴はブラウザの戻るボタンを押して、調べなさい!
さて本題ですが、デリゲートとは少し調べると「委譲」と言うらしいです。
まぁ処理を代表者に任せちゃうぞって感じですかね。
具体的にはあるクラスで特定の処理を他のクラスのメソッドに委ねたいとする。
だけど毎回処理を委ねる相手が同じとは限らない。そんなときのためにC#のデリゲートを使用します。
・使用方法
public delegate void Del ( int x ); // これがデリゲートさん。
class ClassB
{
public int method( int x )
{
return x;
}
}
class ClassA
{
static void Main( string[] args )
{
ClassB obj = new ClassB( );
Del del = new Del( obj.method ) // ここに注目!
Console.WriteLine( del( 5 ) );
}
}
という感じです。
注目箇所を見ると、デリゲート型の del にクラスBの method をセットしているのが解ります。
つまり委譲しているわけですね。
ですが、このデリゲートにメソッドを渡すには条件があります。
それは引数、戻り値の型、数が等しい事です。つまりあらかじめどのようなメソッドを渡すのかデリゲートさんに教えておかなくてはいけないわけです。
・利点、使用目的
このデリゲートですがイマイチ利用する目的が分かりにくいかもしれません。
正直私も初めて知った時はよく使い道が分かりませんでした。
ですが、とりあえず例をあげてみます。
例、条件分岐に使う。
//------------------------------------------------------------------
delegate bool Predicate(int n); // デリゲートです。
class DelegateTest
{
static void Main()
{
Predicate pre = Plus; // pre = new Predicate( Plus ); と同じ意味(暗黙の変換)
int value = 5;
if ( pre( value ) )
{
Console.Write("値は正です");
}
pre = Minus; // 条件変更
if( pre( value ) )
{
Console.Write("値は負です");
}
}
// 別にstaticでなくても大丈夫です
static bool Plus( int n ){ return n > 0; } // 引数 n が正なら true を返す
static bool Minus( int n ){ return n < 0; } // 引数 n が負なら true を返す
}
//------------------------------------------------------------------
出力結果
値は正です
//------------------------------------------------------------------
このように条件を切り替えたい時には有効です。
(コードについて、多分あってると思うけど余り自信がないですw)
・・・つまりメソッドを代入して変更可能と言う事です!
他にもキー入力のイベントハンドラ(例を書くと長いから書きません)等にも使われています。
・書き忘れた事
1、デリゲートにはいくつものメソッドを追加できます。
//---------------------------------------------------------
pre += method1;
pre += method2;
pre += method3;
pre(); // 1,2,3すべてのメソッドがはしります。
//----------------------------------------------------------
2、派生クラスを基底クラスにダウンキャストできるようにデリゲートでも可能です。
引数でも戻り値でもダウンキャスト可能。
3、匿名メソッドという直接デリゲートにメソッドが記述できる。
delegate( int n ){ return n > 0; }
以上で大体のデリゲートの説明です。
実際はまだまだ説明してない事がありますがそこは調べて下さい。
あと関数ポインタに似てるなら関数ポインタ使えばいいと思うかもしれませんが、C#は一部例外がありますが基本ポインタを使用しません。
何故かは調べて下さい。アンマネージコードとかの話になってめんどいですので・・・
ですので、C#にはデリゲートがあります。
たとえ使えはなくてもそういうモノがあるくらいは知っといて損はないですよ~
以上!!
C#の勉強初めて一カ月経ってないか位なんで間違っていたらガンガン指摘下さい。
今回の記事は私自身が理解できているか確かめるのにまとめた感じですので。
あと眠いので誤字、脱字はご勘弁を。
PR
COMMENT
無題
標準で準備されているのはすごい、、
関数ポインタのstd::listでぐるぐる回してる自分にとったらすごい素敵な機能ですね
無題
今のうちにガンガン組んで勉強してた方がイイよ~
それとあくまで関数ポインタに似ているだけで、別物だと言う事は理解しといて下さいね。
無題
最近色々と採用例多いよねコレ。
TGSでもPlayStation Suite SDK の開発言語はC#って発表されてたし。
ただ、VBとかと同じでRADで楽にツール作れるのはいいんだけど、
3Dをどうしようかね…。
Managed DirectX の開発は凍結されてるから、やっぱXNAになるのかね。
自分でDirectXの関数使えるようにDLLインポート属性つけて云々は面倒かも。
一部、DirectXを使えるようにしたライブラリもあるみたいだけど…
無題
無題
Unity使えばいいじゃん
>DirectXの関数使えるようにDLLインポート属性つけて云々・・
アンマネージコードとのマーシャリングは確かにしんどいねw