質問
でお休み下などの委員は、短いエッセイは英語で書の説明を包含するもの目的は、一般に影響を与えます。また巻頭のことでは沈みます。
解決
最も単純な用語では、それは本質的にメソッドへのポインタです。
あなたは(あなたは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からそれを減算したい(私の頭から無作為に選ばれた数)。
さらに検査では、我々がSquareOf
とDoSomethingRad
にその戻り値を入れているためである(約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);
}
DoSomethingLeet
がDoSomethingRad
にどれだけ似ていますか?のみだけではなく、のデータの(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>
は、デリゲートの特別な種類です。これは、整数を受け入れ、long
sを吐き出す動作を格納します。我々は、それが指す方法は、我々が合格整数任意に行うために何が起こっているかわかりません。私たちが知っているすべては、私たちがlong
バックを得ようとしている、何が起こる、ということ。
SquareOf
はの行動のではなく、データを記述しているので、私たちはFunc<int, long>
に任意のパラメータを与える必要はありません。 Radlicious(77, SquareOf)
を呼び出すと、ただのの特定のの整数に何をするかSquareOf
、(「私は数を取り、その広場を返す」)RadliciousにSquareOf
の一般的な動作をしませ与えます。
今、あなたは理解している場合、私は私自身が実際にこのようなものを得ることはありませんのために、あなたはすでに、私を一引き上げてきたか、何を言ってます。
の * ENDのANSWER、放浪白痴* の
BEGIN私が意味する、それはそうint
sは本当に退屈な行動として認識することができようにます:
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およびパスです。にコードの変更が必要です。
代表者具体的には重要
- イベント
- 非同期通話
- LINQ(ラムダ発表)
あなたが誰かにタスクを委任するつもりだった場合は、デリゲートが仕事を受けた者となります。
プログラミングでは、それは実際に何かをする方法を知っているコードのブロックへの参照です。多くの場合、これは、いくつかのアイテムを処理する関数またはメソッドへのポインタである。
はこれです:デリゲートはかなり何をすべきか知っているクラスの手に作業の負担を強制します。完全に彼の兄のように育つしたいが、まだ彼の指導や命令を必要としない子供のようなものと考えてください。代わりに弟(すなわちサブクラス)からのすべてのメソッドを継承し、彼はちょうど彼の兄は仕事を作るか、弟は兄が取るべきアクションを必要と何かをします。あなたはプロトコルのラインに落ちるとき、兄の絶対的に必要とされるかを定義し、または彼はあなたが(Objective-Cで概説されているようすなわち非公式と正式プロトコル)彼は、特定のイベントで行うようにしたいものを選択する柔軟性を与えるかもしれません。
このコンセプトの絶対的な利点は、サブクラスを作成する必要がないことです。あなたは何かが、ラインに落ちるイベントが発生したときに注文をフォローしたい場合は、デリゲートはそれの手を保持し、必要に応じて注文を与えるために開発されたクラスを可能にします。