忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

最近他のメンバーが更新してない

どうも、たくあんです。
ん~皆忙しいだろうなぁ~

過疎らないためにも今日は暇なので更新しますよ~

今日もC#講座だ! 
これ需要あるのかな・・・・・

まぁ頑張って行こうか

拍手[0回]


今日は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

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

無題

  • by 2年
  • 2011/10/05(Wed)16:34
  • Edit
C#には関数オブジェクトを突っ込む仕組みが
標準で準備されているのはすごい、、
関数ポインタのstd::listでぐるぐる回してる自分にとったらすごい素敵な機能ですね

無題

  • by たくあん
  • 2011/10/05(Wed)22:29
  • Edit
その通りかもしれませんが、ポインタをしっかり理解していないと結局はC#で詰みます。
今のうちにガンガン組んで勉強してた方がイイよ~
 それとあくまで関数ポインタに似ているだけで、別物だと言う事は理解しといて下さいね。

無題

  • by 大西(はかせ)
  • 2011/10/06(Thu)02:44
  • Edit
C#かぁ~。この頃ツールを作ってないせいか使った記憶があまり無い・・・
最近色々と採用例多いよねコレ。
TGSでもPlayStation Suite SDK の開発言語はC#って発表されてたし。
ただ、VBとかと同じでRADで楽にツール作れるのはいいんだけど、
3Dをどうしようかね…。
Managed DirectX の開発は凍結されてるから、やっぱXNAになるのかね。
自分でDirectXの関数使えるようにDLLインポート属性つけて云々は面倒かも。
一部、DirectXを使えるようにしたライブラリもあるみたいだけど…

無題

  • by 大西(はかせ)
  • 2011/10/06(Thu)02:45
  • Edit
C++で楽にツール作れるQtも魅力的だったり…

無題

  • by たくあん
  • 2011/10/06(Thu)12:52
  • Edit
>3Dをどうしようかね…。

Unity使えばいいじゃん

>DirectXの関数使えるようにDLLインポート属性つけて云々・・

アンマネージコードとのマーシャリングは確かにしんどいねw

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]