• ベストアンサー

デリゲートの使い方

デリゲートはどのように使うのですか? 書き方はわかるのですが使いどころがいまいちわかりません。 何やら柔軟なプログラムが作れそうな気はするのですが。 使い方のサンプルをいくつか見たり、自分で考えたりしましたが、 そういった例は必ずしもデリゲートを使わなくても書けそうです。 デリゲート使わないと他に手段がないような使い方を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

意識せずに使っていないところでは、イベントハンドラがデリゲートです。 このように「呼び出すところまでは一緒、でも呼び出し先の処理はケースによる」というような箇所には非常に有用です。 その他には、フォームのオーナースレッド以外からフォームを操作したいときにはデリゲートを使わなければなりません。 http://www.atmarkit.co.jp/fdotnet/dotnettips/312ctrlinvoke/ctrlinvoke.html

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VB or C# デリゲート

    こんにちわ。C#を勉強しております。 デリゲートについてなんですがデリゲートは一体どういった時に使うべきなのかをお聞きしたいです。自分でも調べマルチスレッドのときとかに使うとか書いてありました。 ただちょっと曖昧でプログラミングを余り知らない人間に対してもある程度納得させられるような理解にしたく悩んでおります。プログラムで○○したいときに使うなどそういった感じのだとわかりやすいかと思います。よろしくお願いします。

  • デリゲートとジェネリクスとかの使いどころについて

    インターフェイスとデリゲートとジェネリクスとコレクションの使いどころについて質問です。 これら4つの使いどころが、いつ使うのかわかりません。 どういったときに使うのか教えてくださいmm

  • VB.NETのデリゲートについて

    VB.NETのデリゲートについて質問です。 以下のプログラムなのですが、 デリゲート型をインスタンス化しているところで、コンストラクタにパラメータを渡していますが、 そのコンストラクタはどこに定義されているのでしょうか。 (AddressOf t1.Ohayou)というパラメータが渡されていますが、このパラメータを受け取っているコンストラクタがどれなのかが分かりません。 ご教示よろしくお願いいたします。 Delegate Sub Myprint(ByVal s As String) Module Module1 Sub Main() Dim t1 As Test1 = New Test1() Dim t2 As TEst2 = New Test2() Dim d As Myprint = New Myprint(AddressOf t1.Ohayou) d.Invoke("VB太郎") d = New Myprint(AddressOf t2.Konbanwa) d.Invoke("VB太郎") End Sub End Module Class Test1 Sub Ohayou(ByVal s As String) Console.WriteLine("おはようございます。{0}です。", s) End Sub End Class Class Test2 Sub Konbanwa(ByVal s As String) Console.WriteLine("こんばんわ。{0}です。", s) End Sub End Class

  • c# インターフェイスとデリゲート

     こんにちは、c#初心者です。  唐突ですが、IComparer<T>って、ありますよね? List<T>などで、ソートを行うときに使うやつです。それともうひとつ、Comparison<T>もありますよね? これもソートに使えるようです。  自分としては、新しい型を作らなくても良くて、デルタ式もメソッドも使えるデリゲート(Comparison<T>)の方が3倍使いやすいのですが、IComparer<T>がいまだに残っているのは互換性のためでしょうか? デルタ式も、匿名メソッドも無かった時代の名残だと思っているのですが、合っていますか?  もしどちらを使うかで安全性や、パフォーマンスに影響するのなら考え物なのですが……。  最初は区別付かなかったのですが、IComparable<T>は使われ方が違うので、その重要性はいまだに衰えていないと思うのですが、合っているでしょうか?  どなたか分かる方がいらっしゃいましたら教えていただけませんか?

  • c# デリゲート関連の命名について

     こんにちは。c#初心者です。  今回はデリゲート関連の命名についての質問です。 // ――――――――――――――――――――――――――――――― // 簡素化のため、フィールド変数のまま書いています public delegate int SampleDelegate(); public SampleDelegate SampleAction; public int Value {   get { return SampleAction(); } } // ―――――――――――――――――――――――――――――――  上記のようなコードを書いているのですが、「SampleDelegate」に当たる部分、「SampleAction」にあたる部分にはどのような名前をつければいいのかと迷っています。  SampleDelegateは値を取得するメソッドを表すので「GettingValue」や、「ValueGetter」がいいのか、それとも「ValuePasser」みたいなのがいいのか、それ以外がいいのか、  SampleActionも「ValueGetter」がいいのかそれとも、メソッドと同じように「GetValue」にするのがいいのかそれ以外がいいのかと悩んでいます。  最初は「SampleDelegate」が「GettingValue」、「SampleAction」が「ValueGetter」になっているのですが、反対の方がいいような気がしたり、その他いろいろで困っています。  どなたか詳しい方いらっしゃいましたら教えていただけませんか? できれば「『SampleAction』は動作自体だからGettingValueのように『~すること』 のように動名詞を使い方がいい」のように他の命名においても応用が利く教え方にしていただけるとありがたいです。

  • ActionScriptのステップアップのために他言語を学ぶべきでしょうか?

    現在ActionScriptを勉強している者です。 プログラムの経験はActionScriptが初です。 サンプル本などを勉強して、それに記載されているようなことは自分で組めるようになったのですが、やはりサンプル本ではなにかプログラムの根本を学べた気がしませんでした。 僕が学びたいのは”この場面ではこのように解く”といったようなもっとプログラミングの手法に迫ったものなのです。 そこでそのような書籍はないものかと思い、さがしたのですが、ActionScriptではなかなか見当たらず、JavaやCといった他言語の書籍ではそういったものが多いような気がしました。(あくまでも、推測です) やはり、Flash使いになるためには他言語も学ぶべきでしょうか? また、Flashでプログラミングの手法を扱った書籍があるのでしたらどなたか教えてください。 よろしくお願いします

  • C#のデリゲートを用いたイベントで戻り値を付けたい

    C#のデリゲートを用いたイベントで イベントハンドラに戻り値がある場合は どのように記述すればよいのでしょうか。 以下のコードでは(A)のところで error CS0029: 型 'void' を型 'string'に暗黙的に変換できません。 というエラーになります。 --------------------------------------- //sample.cs //イベントハンドラ(戻り値あり) using System; namespace My {  delegate string MyDelegate();  class MainClass  {   public static void Main()   {    string msg;    MyClass mc = new MyClass();    MyEventClass mec = new MyEventClass();    mec.eventname += new MyDelegate(mc.myget);    msg = mec.Oneventname(); // <--------(A) //  msg = (string)mec.Oneventname();    Console.WriteLine(msg);   }  }    class MyClass  {   public string myget()   {    string msg;    msg = "イベントハンドラが呼び出されました";    return msg;   }  }  class MyEventClass  {   public event MyDelegate eventname;   public void Oneventname() // public string Oneventname()   {    if(eventname != null)    {     eventname(); //   return eventname();    }   }  } } ---------------------------------------

  • PDF画像の変換方法

    質問させていただきますっ!! すでにあるPDF画像を読み込んで、JPG画像として吐き出すプログラムをPHPで行いたいのですが、可能でしょうか? 例:)sample.pdf(読み込み) -> プログラム -> sample.jpg(吐き出し) 自分で調べたのですが、見つからず・・・(探し方が悪いとはおもいますが。。。) 企画段階なので、できるか否かが欲しいです!! どうかご返答お願い致します!!!

    • ベストアンサー
    • PHP
  • 親クラスから呼ぶ

    Javaで親クラスから子クラスを生成して、子クラスから親クラスのメソッドを呼ぶことが できますか? Cなら関数ポインタで呼ぶことができました。 また、C#ならデリゲートなどを使用して呼べました。 可能であれば小さいサンプルでいいので、教えていただけないでしょうか?

    • ベストアンサー
    • Java
  • デリゲートについて

    初心者です。デリゲートを初めて使うのですが、 スレッド処理でWebClientでイベントハンドラを作成した後、 以下の Delegate Sub MyDelegate() Private Sub downloadClient_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) If InvokeRequired Then Invoke(New MyDelegate(AddressOf DownloadProgressA)) '終わり Else ProgressBar1.Value = e.ProgressPercentage Label1.Text = e.ProgressPercentage & "%" End If End Sub でDownloadProgressAには ProgressBar1.Value = e.ProgressPercentage Label1.Text = e.ProgressPercentage & "%" と書いたのですが、 メソッド 'Private Sub DownloadParmertar(sender As Object, e As System.Net.DownloadProgressChangedEventArgs)' に、デリゲート 'Delegate Sub MyDelegate()' と互換性があるシグネチャがありません とエラーが発生します。 スレッド処理やDelegate、Invokeを初めて使うので よく分かりません。どうすれば進行度を処理表示 出来るでしょうか…。 お優しい方教えて下さい。

このQ&Aのポイント
  • アンドロイドTVでの視聴は可能ですか?
  • アンドロイドTVの視聴には注意点はありますか?
  • ひかりTVのサービスやISPぷららとの関連はありますか?
回答を見る