[解決済み】C#でイベントとイベントハンドラを理解する
質問
イベントの目的、特にユーザーインターフェースの作成という文脈では理解しています。これは、イベントを作成するためのプロトタイプだと思います。
public void EventName(object sender, EventArgs e);
イベントハンドラとは何なのか、なぜ必要なのか、そしてどのように作成するのか。
どのように解決するのですか?
イベントハンドラを理解するためには デリゲート . で C# デリゲートはメソッドへのポインタ(または参照)であると考えることができます。これは、ポインタを値として渡すことができるため便利です。
デリゲートの中心的な概念は、そのシグネチャ(形状)です。つまり、(1)戻り値の型と(2)入力引数です。たとえば、デリゲートを作成する場合
void MyDelegate(object sender, EventArgs e)
を返すメソッドのみを指すことができます。
void
であり、かつ
object
と
EventArgs
. 四角い穴と四角い釘のようなものです。つまり、これらのメソッドはデリゲートと同じシグネチャ、または形状を持っていると言うことです。
つまり、システムの他の場所で何かが起こったときに、何らかのコードを実行させたい、つまりイベントを処理したいのです。そのためには、実行させたいコードに対応する特定のメソッドを作成します。イベントと実行されるメソッドの間にある糊がデリゲートです。イベントは、イベントが発生したときに呼び出すべきメソッドへのポインタの "list" を内部に保持する必要があります * もちろん、メソッドを呼び出せるようにするには、そのメソッドに渡すべき引数を知る必要があります もちろん、メソッドを呼び出すためには、そのメソッドに渡す引数を知っておく必要があります! イベントと呼び出されるすべてのメソッドの間の "contract" として、デリゲートを使用します。
そのため、デフォルトの
EventHandler
(を表します(そして、そのような多くのものは
メソッドの特定の形状
(ここでもvoid/object-EventArgs)。イベントを宣言するとき、あなたは次のように言っているのです。
どのような形状のメソッド
(EventHandler)のデリゲートを指定することで、そのイベントが呼び出されるようになります。
//This delegate can be used to point to methods
//which return void and take a string.
public delegate void MyEventHandler(string foo);
//This event can cause any method which conforms
//to MyEventHandler to be called.
public event MyEventHandler SomethingHappened;
//Here is some code I want to be executed
//when SomethingHappened fires.
void HandleSomethingHappened(string foo)
{
//Do some stuff
}
//I am creating a delegate (pointer) to HandleSomethingHappened
//and adding it to SomethingHappened's list of "Event Handlers".
myObj.SomethingHappened += new MyEventHandler(HandleSomethingHappened);
//To raise the event within a method.
SomethingHappened("bar");
(*これが.NETにおけるイベントの鍵であり、quot;magic"を取り除きます - イベントは実際には、カバーの下では、同じquot;shape"のメソッドのリストだけです。このリストは、イベントが存在する場所に保存されます。イベントが発生したら、このメソッドのリストを見て、これらの値をパラメータとして各メソッドを呼び出すだけです。イベントハンドラを割り当てることは、呼び出されるメソッドのリストにあなたのメソッドを追加する、よりきれいで簡単な方法なのです。)
関連
-
[解決済み】Visual studio 2019がデバッグ時にフリーズする件
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] .NETでのdecimal, float, doubleの違い?
-
[解決済み] Microsoft Officeをインストールせずに、C#でExcel(.XLSおよび.XLSX)ファイルを作成するにはどうすればよいですか?
-
[解決済み] 動的に生成された要素にイベントバインディングを行うか?
-
[解決済み] C#のconstとreadonlyの違いは何ですか?
-
[解決済み] jQuery 複数のイベントで同じ関数を起動する
-
[解決済み] jQueryでオブジェクトに登録されたイベントハンドラを検索する
-
[解決済み] あるイベントからすべてのイベントハンドラを削除する方法
-
[解決済み】C#のイベントとスレッドセーフについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" (API定義の読み込みに失敗しました
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み】WebResource.axdとは何ですか?
-
[解決済み】Nullableオブジェクトは値を持たなければならない?
-
[解決済み】デリゲートを使用するタイミングと理由は?[重複あり]