まず、オープニングの悔い改め
プログラミング言語のC#で彼らの最高に、今まで私はC#のデリゲートとイベントの使用方法を理解しているので、私は、あなたに申し訳ありませんと言いたい、それを恥じ。まあ、それは単にそれの簡単なデリゲートの使用とイベントについての話に晴れた朝の利点を取っている、私は初心者に助けを与えることを願っています。PS:DOは私が最後にC#のデリゲートとイベントを学ぶために数年行ったように使用する方法がわかりません。
最終的には二、デリゲートは何ですか
子供たちは、C言語では、常にあなたが、私はそんなに悪く学ぶようならば、関数ポインタは常にあなたがデリゲートを理解することができることを伝えるためにあえて、ああ、常にそれを聞い使用しない場合でも、それを使用し、それを研究しますCあなたは、クラスBの別のメソッドmのオブジェクトにクラスAを通過することを可能にする関数ポインタに、オブジェクトがこのメソッドmを呼び出すことができ、クラスBように、その手段は、メソッドにパラメータとして渡すことができます。しかし、委任と機能はほとんど差をポインタ、関数ポインタを使用できない多くの利点を持ってい委任する。まず、関数ポインタは、静的関数を指すことができるが、デリゲートは、両方の静的関数を参照することができるだけでなく、非静的メンバ関数を参照することができます。非静的メンバ関数を参照する場合、エントリポイントを参照し保存するだけでなく、この機能を委任するだけでなく、クラスのインスタンスには、この関数の参照への呼び出しを保存します。第二は、関数ポインタと比べて、デリゲートは、オブジェクト指向、型安全で信頼性の高い制御(管理)オブジェクトです。言い換えれば、有効な方法とランタイム性を保証デリゲートポイントは、無効なアドレス、またはアドレスクロスボーダーを指すようになりますデリゲートを心配する必要はありません。
より多くのそれを言って何ができるか、コードは、例えば以下の最後の言葉です、是非、それのいくつかの例を見て:
最初の例:
public
class
DelegateTest
{
// 声明delegate对象
public
delegate
void
CompareDelegate(
int
a,
int
b);
// 欲传递的方法,它与CompareDelegate具有相同的参数和返回值类型
public
static
void
Compare(
int
a,
int
b)
{
Console.WriteLine((a>b).ToString());
}
public
static
void
Main()
{
// 创建delegate对象
CompareDelegate cd =
new
CompareDelegate(DelegateTest.Compare);
// 调用delegate
cd(1,2);
}
}
もう一つの例:
public
delegate
void
MyTestDelegate(
int
i);
public
class
Program
{
public
static
void
Main()
{
//创建delegate
ReceiveDelegateArgsFunc(
new
MyTestDelegate(DelegateFunction));
}
//这个方法接收一个delegate类型的参数,也就是接收一个函数作为参数
public
static
void
ReceiveDelegateArgsFunc(MyTestDelegate func)
{
func(21);
}
//欲传递的方法
public
static
void
DelegateFunction(
int
i)
{
System.Console.WriteLine(
"传过来的参数为: {0}."
, i);
}
}
デリゲート手数料を理解する必要があり、あなたのIQはそれが起こるかであるとよく、私は2の下で、自分の気まぐれを理解していない場合、次のイベントのイベントとは、それについて何かを言います。
第三に、イベントは、あなたがクリック時をだます理解することは来る方法です
さて、私たちは、プログラマは非常に愚かな、ドラッグコントロールを.NET認め、その後、ビンをクリック時]をクリックし、唯一のMicrosoftの行わ素晴らしい仕事を責めることはできますが、単にJavaプログラマのそれらの嫉妬羨望が私たちに、.NETプログラマを軽蔑しましょう。実際に、私たちは本当に我々.NETプログラマがより多くの自信を持って、私は蒸気を吹き飛ばすようになり、今日、私たちのJavaプログラマの侮辱に直面することができ、その背後にあるメカニズムを理解することができれば、私たちのOnClickは本当に、簡単ではないことを言うだろう、クリック時の裏話明らかにします。
クリック時に言えば、私はイベントイベント.NETでそれを言わなければならないでしょう。
C#でのイベント処理は、実際には、特別な署名デリゲート、次のようなこのルックスです。
パブリックデリゲート無効MyEventHandler(オブジェクト送信者、MyEventArgs E)。
ここで、送信者の代わりに2つのパラメータは、送信者イベント、eはイベント型パラメータです。イベントに関連するデータを格納するために使用MyEventArgsクラスは、すべてのイベント引数クラスは、System.EventArgsクラスから派生しなければなりません。もちろん、パラメータなしであなたのイベントは、あなたが直接引数としてSystem.EventArgsクラスを使用することができます。
まあ、我々はそれについて話をする例として、イベントをクリック時達成するために行くだろう。
//这里自定义一个EventArgs,因为我想知道Clicker
public
class
ButtonClickArgs : EventArgs
{
public
string
Clicker;
}
public
class
MyButton
{
//定义一个delegate委托
public
delegate
void
ClickHandler(
object
sender, ButtonClickArgs e);
//定义事件,类型为上面定义的ClickHandler委托
public
event
ClickHandler OnClick;
public
void
Click()
{
//...触发之前可能做了n多操作
//.....
//这时触发Click事件,并传入参数Clicker为本博主ivy
OnClick(
this
,
new
ButtonClickArgs() { Clicker =
"ivy"
});
}
}
public
class
Program
{
public
static
void
Main()
{
MyButton btn =
new
MyButton();
//注册事件,把btn_OnClick方法压入事件队列,
//可以+=多个,这里简单点就压入一个吧。
btn.OnClick +=
new
MyButton.ClickHandler(btn_OnClick);
btn.Click();
}
//怎么看到这个函数很熟悉吧,就是你原来双击button自动产生的代码
public
static
void
btn_OnClick(
object
sender, ButtonClickArgs e)
{
Console.WriteLine(
"真贱,我居然被ivy点击了!"
);
}
}
まあ、私はあなたがそれを理解しているか否か、2で今左利き右を再生する方法がわからない、私はとにかくそれを得た、これは何を読んするイベントを理解することができます教えてください例であるべきだと思います。
IVの概要
これはいつも、私はあなたが理解することを願って、Javaプログラマをいじめて、すぐにそれを改善することはありません、していないだけで毛皮のデリゲートとイベントについて話しましたが、非常に基本的なされダブルクリックボタン、または書き込みA
btn.OnClick + =新しいMyButton.ClickHandler(btn_OnClick)。