質問

でお休み下などの委員は、短いエッセイは英語で書の説明を包含するもの目的は、一般に影響を与えます。また巻頭のことでは沈みます。

役に立ちましたか?

解決

最も単純な用語では、それは本質的にメソッドへのポインタです。

あなたは(あなたはint型を保持することができますint型の変数を持っているのと同じように)デリゲート型を保持する変数を持つことができます。あなたは、単に関数のように、あなたの変数を呼び出すことによってデリゲートにポイントというメソッドを実行することができます。

これは、変数のデータを持っているかもしれません同じように、あなたが変数の機能を持つことができます。あなたのオブジェクトは、可能なすべての機能自体を定義しなくても、他のオブジェクトからの代表団を受け入れ、それらを呼び出すことができます。

あなたは、オブジェクトがユーザー指定の基準に基づいて物事をしたいとき

これは非常に便利です。例えば、ユーザ定義の真/偽の式に基づいてリストをフィルタリングします。あなたは、ユーザーがに対する各リスト項目を評価するためのフィルタとして使用するデリゲート関数を指定させることができます。

他のヒント

私は機能を持っています:

public long GiveMeTwoTimesTwo()
{
    return 2 * 2;
}

この機能は吸います。私がしたい場合は3 * 3?

public long GiveMeThreeTimesThree()
{
    return 3 * 3;
}

が多すぎるタイピング。私は怠け者!

public long SquareOf(int n)
{
    return n * n;
}

私のSquareOf機能はnが何であるかを気にしません。これは、渡された任意のnのために正しく動作します。そのnが整数である知っていることは、まさに数nです知りませんが、のはのん。あなたは"Haha not an integer"SquareOfを渡すことはできません。

ここでは別の機能があります:

public void DoSomethingRad()
{
    int x = 4;
    long y = SquareOf(x);
    Console.WriteLine(y);
}

その名前に反して、DoSomethingRadは、実際には何もRADを行いません。しかし、それはSquareOfを書きません16.私たちはあまり退屈することに変更することができている(4)?

public void DoSomethingRad(int numberToSquare)
{
    long y = SquareOf(numberToSquare);
    Console.WriteLine(y);
}

DoSomethingRadはまだ明らかにかなり失敗しています。それは16毎回の書き込みはありませんので、しかし、少なくとも今は、広場に数を渡すことができます。 (これは1、または4、または9、または16、または... ZZZZまだちょっと退屈を書きます)。

渡された番号に何が起こるかの変化への道があった場合は、

これはいいことだろう多分、我々はそれを二乗する必要はありません。多分私達はそれを、キューブ、または69からそれを減算したい(私の頭から無作為に選ばれた数)。

さらに検査では、我々がSquareOfDoSomethingRadにその戻り値を入れているためである(約numberToSquareの心配事は、我々はそれを整数(long)を得ることができ、それは私たちにyを与えることであることをyの一部だけかのように思えますlong)。

public long CubeOf(int n)
{
    return n * n * n;
}

public void DoSomethingLeet(int numberToSquare)
{
    long y = CubeOf(numberToSquare);
    Console.WriteLine(y);
}

DoSomethingLeetDoSomethingRadにどれだけ似ていますか?のみだけではなく、のデータの(DoX())...

の行動の(int n)に渡す方法があった場合

だから今、私たちは数の二乗を書きたいならば、我々はDoSomethingRadすることができますし、我々は数のキューブを書きたいならば、我々はDoSomethingLeetすることができます。私たちは69から差し引か番号を書きたいのであれば、我々は別の方法、DoSomethingCoolをしなければならないのですか?いいえ、それはあまりにも気多くのタイピングがかかるため(そしてもっと重要なのは、それが私たちのプログラムの唯一の一側面を変更することにより、ALTER興味深い行動に我々の能力を妨げる)。

私たちが到着だからます:

public long Radlicious(int doSomethingToMe, Func<int, long> doSomething)
{
    long y = doSomething(doSomethingToMe);
    Console.WriteLine(y);
}

私たちは、これを書き込むことによって、このメソッドを呼び出すことができます:

Radlicious(77, SquareOf);

Func<int, long>は、デリゲートの特別な種類です。これは、整数を受け入れ、longsを吐き出す動作を格納します。我々は、それが指す方法は、我々が合格整数任意に行うために何が起こっているかわかりません。私たちが知っているすべては、私たちがlongバックを得ようとしている、何が起こる、ということ。

であります SquareOfの行動のではなく、データを記述しているので、

私たちはFunc<int, long>に任意のパラメータを与える必要はありません。 Radlicious(77, SquareOf)を呼び出すと、ただのの特定のの整数に何をするかSquareOf、(「私は数を取り、その広場を返す」)RadliciousにSquareOfの一般的な動作をしませ与えます。

今、あなたは理解している場合、私は私自身が実際にこのようなものを得ることはありませんのために、あなたはすでに、私を一引き上げてきたか、何を言ってます。

* ENDのANSWER、放浪白痴*

BEGIN 私が意味する、それはそうintsは本当に退屈な行動として認識することができようにます:

static int Nine()
{
    return 9;
}

、データは単に行動尻の退屈さと正常に認識されているもので、ぼかしにデータや行動に現れるものです。

の間に線を言いました もちろん、一つは、抽象パラメータのすべての種類がかかりますが、それを呼び出すことができるように情報のトンを必要とするスーパー「面白い」行動を、想像できます。何それが私たちのためにソース、それをコンパイルすることをコードと実行を提供することが必要な場合はどうなりますか?

さて、その後、私たちの抽象化は私達に戻って振り出しにすべての方法を得ているようです。私たちは、それはそれを行うために何が起こっているかを判断するために、私たちのプログラムのソースコード全体を必要とするので、抽象的行動を持っています。これは完全に不確定であるbehavioR:関数は、の何でもを行うことができますが、それはそれが何をするかを決定するために、のすべてののに提供されなければなりません。このようNine()など一方、完全に確定的行動、で、追加情報を必要としませんが、リターン9以外何もすることができません。

だから何?私は知りません。

デリゲートは、メソッドへのポインタです。その後、他のメソッドのパラメータとしてデリゲートを使用することができます。

ここのは簡単なチュートリアルへのリンクです。

私が持っていた質問は、「私はそれをしたいと思うだから、なぜ、?」でしたあなたも一緒にプログラミングの問題を解決するまで、あなたは本当に「それを得る」ことはありません。

それは誰が代表団の重要な利点の一つに言及しなかったことは興味深いです - あなたはその継承が魔法の弾丸ではないが、通常、それは解決よりも多くの問題を作成し、実現したときに、それはサブクラス化することが好ましいです。それは、多くのデザインパターンの基本で、最も注目すべきは、の戦略のパターンます。

デリゲートインスタンスは、メソッドへの参照です。彼らは便利です理由は、あなたがタイプの特定のインスタンス上の特定のメソッドに結び付けられているデリゲートを作成できることです。デリゲートのインスタンスを使用すると、メソッドを呼び出すどのオブジェクトがあなたのレキシカルスコープを残している場合でも、その特定のインスタンス上でそのメソッドを呼び出すことができます。

このようなデリゲートのインスタンスのための最も一般的な用途は、コールバック<の概念をサポートすることです/ A>言語レベルでます。

これは単に方法を参照しています。彼らは、クロススレッドでの作業に大きな使用して来ます。

ここに私のコードの例右のアウトがある。

 //Start our advertisiment thread
    rotator = new Thread(initRotate);
    rotator.Priority = ThreadPriority.Lowest;
    rotator.Start();

    #region Ad Rotation
    private delegate void ad();
    private void initRotate()
    {
        ad ad = new ad(adHelper);
        while (true)
        {
            this.Invoke(ad);
            Thread.Sleep(30000);
        }

    }

    private void adHelper()
    {
        List<string> tmp = Lobby.AdRotator.RotateAd();
        picBanner.ImageLocation = @tmp[0].ToString();
        picBanner.Tag = tmp[1].ToString();            
    }
    #endregion

あなたがデリゲートを使用するdidntの場合はLobby.AdRotator機能をcrossthreadおよびコールすることができません。

他の人のようにデリゲートは、関数への参照である、と述べています。より有益な用途(IMO)の一つは、イベントです。あなたが呼び出すためのイベントのための関数を登録し、参加者はこの作業に最適です。

イベントを登録するとき

は、最も基本的な用語では、デリゲートは、(参照)機能が含まれているだけの変数です。彼らはあなたが関数が実際にから来た「」のための任意の心配せずに変数として周りの機能を渡すことができますので、参加者は便利です。

それは変数に束ねされていたときに機能がコピーされていないことを、当然のことながら、注意することが重要です。それは、あくまでも参考に拘束されることです。たとえばます:

class Foo
{
    public string Bar
    {
        get;
        set;
    }

    public void Baz()
    {
        Console.WriteLine(Bar);
    }
}

Foo foo = new Foo();
Action someDelegate = foo.Baz;

// Produces "Hello, world".
foo.Bar = "Hello, world";
someDelegate();

ほとんど簡単に責任を実行する方法を委託する別のオブジェクトです。いる会社の社長が、国家の金型および社長のアメリカが現在の葬儀のとお見舞いメッセージ。の場合長の米国なることができ、この責務を委任する人は、副会長、理事、幹事となった。

じなければなります。委譲タイプで、オブジェクトが実行可能の研究"に関するお問合せ

例えば.

Class Person
{
   public string GetPersonName(Person person)
   {
     return person.FirstName + person.LastName;
   }

   //Calling the method without the use of delegate
   public void PrintName()
   {
      Console.WriteLine(GetPersonName(this));
   }

   //using delegate
   //Declare delegate which matches the methods signature
   public delegate string personNameDelegate(Person person);

  public void PrintNameUsingDelegate()
  {
      //instantiate
      personNameDelegate = new personNameDelegate(GetPersonName);

      //invoke
      personNameDelegate(this);
  }

}

のGetPersonNameメソッドが呼び使用のdelegateオブジェクトpersonNameDelegate.またしていきたいでにPrintNameUsingDelegate方法を代表としてパラメータとします。

public void PrintNameUsingDelegate(personNameDelegate pnd, Person person)
{
   pnd(person);
}

のであれば印刷したいのlastname_firstnameたのでラップする方法personNameDelegateおよびパスです。にコードの変更が必要です。

代表者具体的には重要

  1. イベント
  2. 非同期通話
  3. LINQ(ラムダ発表)

あなたが誰かにタスクを委任するつもりだった場合は、デリゲートが仕事を受けた者となります。

プログラミングでは、それは実際に何かをする方法を知っているコードのブロックへの参照です。多くの場合、これは、いくつかのアイテムを処理する関数またはメソッドへのポインタである。

私が思い付くことができます絶対最も簡単に言うと、

はこれです:デリゲートはかなり何をすべきか知っているクラスの手に作業の負担を強制します。完全に彼の兄のように育つしたいが、まだ彼の指導や命令を必要としない子供のようなものと考えてください。代わりに弟(すなわちサブクラス)からのすべてのメソッドを継承し、彼はちょうど彼の兄は仕事を作るか、弟は兄が取るべきアクションを必要と何かをします。あなたはプロトコルのラインに落ちるとき、兄の絶対的に必要とされるかを定義し、または彼はあなたが(Objective-Cで概説されているようすなわち非公式と正式プロトコル)彼は、特定のイベントで行うようにしたいものを選択する柔軟性を与えるかもしれません。

このコンセプトの絶対的な利点は、サブクラスを作成する必要がないことです。あなたは何かが、ラインに落ちるイベントが発生したときに注文をフォローしたい場合は、デリゲートはそれの手を保持し、必要に応じて注文を与えるために開発されたクラスを可能にします。

scroll top