■RSS■
■CALENDAR■
      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   
<<前月 2010年09月 次月>>
■NEW ENTRIES■
■CATEGORIES■
■コミュニケーション■
■ARCHIVES■
■ECO■
■POWERED BY■
■COUNTER■



■PROFILE■
す~(Suzuki)
適当なプログラムばっかりしか作れない若輩プログラマです。
りっぱなSE目指して色々とお勉強中

エントリの内容は個人的に収集、実験した結果を元にしております。
内容の正確性などは一切保証されませんので、予めご了承くださいm<__>m
また、もしどなたかの権利を侵害してしまっている恐れがある場合などはご連絡お願いします。
■LOGO■
ORACLE MASTER Bronze Oracle Database 10g
■OTHER■
  • 処理時間 0.849814秒
delegateとはなんでしょう?
C/C++を使っていた時には「ポインタ」ってよく使ってた、というよりも必須だったわけですが、そのポインタの使い方をちょっと思い出してみると「関数ポインタ」なるものがあったはず。
関数といえどもメモリ上に展開されているので、呼び出したい関数のエントリーポイントになるアドレスを必ずもっているはずなんですよ。
で、そのアドレスすのものを扱おうってのが関数ポインタでした。
なぜいきなりポインタなんてでてきたのか、それは「デリゲート(delegate)」が関数ポインタとよく似ているからです。
ただし、似ているだけで別物なので混同しないようにしないといけません。

delegateはメソッドを保持するオブジェクトです。つまり、delegateを使うとメソッドをintとかstringみたいな基本データ型を扱うのと似たような感覚で扱えるようになります。
それができて何がうれしいって、そりゃあやっぱりメソッドが実行時に切り替えられるってとこですよ。
他には「イベント」を使う場合、これはdelegateなしでは無理ですはうー

深く追求すればいろいろと難しいこともあるのかもしれませんが、そんなに深く追求しなくても多分問題なく使えるのでよしとします!

イベントを使う場合にdelegateが必須なのはとっても簡単。
何か適当にコントローラ置いてイベントハンドラーを追加してみてください。
そのイベントハンドラーの名前って固定じゃないですよね?名前はどうだってよくて、重要なのは戻り値の型とパラメータの型および順序です。
それさえあっていればイベントハンドラーとして使えます。
delegateを意識していないだけで、恩恵を受けてるんですよね。

delegateの宣言と、格納するメソッドの戻り値の型、パラメータの型および順序はちゃんとあわせてくださいね。
あわせないとビルドできないはずだけど汗

うーん、なんか読みにくい文章。。。
delegateを使った簡単な例で計算プログラムでも作ってみましょ。

実際にはこんな使い方しないかもしれないけど、こういう使い方もできるよっということでむむっ
簡易計算機
  1. using System;
  2. using System.Collections;
  3. namespace Calc
  4. {
  5. public class Program
  6. {
  7. public static void Main(string[] args)
  8. {
  9. System.Collections.Generic.Dictionary operations = new System.Collections.Generic.Dictionary();
  10. operations.Add("+", new Operation(Add));
  11. operations.Add("*", new Operation(Multi));
  12. operations.Add("-", new Operation(Sub));
  13. operations.Add("/", new Operation(Div));
  14. Console.WriteLine("1 + 2 = " + operations["+"](1, 2));
  15. Console.WriteLine("1 * 2 = " + operations["*"](1, 2));
  16. Console.WriteLine("1 - 2 = " + operations["-"](1, 2));
  17. Console.WriteLine("1 / 2 = " + operations["/"](1, 2));
  18. }
  19. /// <summary>
  20. /// 計算処理のデリゲートの定義
  21. /// </summary>
  22. /// 第一項
  23. /// 第二項
  24. /// <returns>計算結果</returns>
  25. private delegate decimal Operation(decimal param1, decimal param2);
  26. private static decimal Add(decimal param1, decimal param2)
  27. {
  28. return param1 + param2;
  29. }
  30. private static decimal Multi(decimal param1, decimal param2)
  31. {
  32. return param1 * param2;
  33. }
  34. private static decimal Sub(decimal param1, decimal param2)
  35. {
  36. return param1 - param2;
  37. }
  38. private static decimal Div(decimal param1, decimal param2)
  39. {
  40. return param1 / param2;
  41. }
  42. }
  43. }

実行結果
  1. 1 + 2 = 3
  2. 1 * 2 = 2
  3. 1 - 2 = -1
  4. 1 / 2 = 0.5
| http://www3.to/su-house/index.php?e=23 |
| プログラミング::.NET Framework | 10:00 PM | comments (0) | trackback (0) |

PAGE TOP ↑