イベント\デリゲートに関する陰湿な質問

インタビューでは、インタビュアーはあらゆる種類のトリッキーな質問をするのが好きです。 .netプラットフォームを理解するためのお気に入りの質問の1つは、イベントとデリゲートに関する質問です。 せいぜい、彼らは違いを求めます;最悪の場合、彼らはそのような埋め戻しの質問をすることができます。







ダンコード:



public class A

{

public void OnDoWork()

{

if ( DoWork != null )

DoWork( this , EventArgs .Empty);

}



public event EventHandler DoWork;

}




* This source code was highlighted with Source Code Highlighter .








1.クラスAが次のように変更された場合、プログラムはどうなりますか:キーワードevent



削除しますか?

2.コード全体からevent



キーワードを削除すると、プログラムはどうなりますか?



訓練されていない質問は、気づくとすぐに不気味な認知的不協和音に導入されます。 ここでの主なことは、inする叫びを控え、デリゲートからのイベントの適用可能性の構文上の違いを思い出すことです。



0.イベントは、イベントという単語を介していくつかのプロパティが付与されているのと同じデリゲートです。

1.イベントとデリゲートの両方をクラスのフィールドとして宣言できますが、デリゲートとは異なり、イベントをメソッドのローカル変数にすることはできません(多くのことは行いませんが、覚えておく価値があります)

2.イベントは、それが宣言されたクラスの外部ではトリガーできません(これが最も重要な違いです!!!)

3.インターフェイスにフィールドを含めることはできません。

4.イベントは常にプロパティではなく「フィールド」として宣言されます( add-remove



はカウントされません)。



これらは、おそらく、イベントとデリゲートの唯一の違いです(意味の違いを考慮するとは思わない)。 さて、または私は何かを忘れましたが、あなたは今私に思い出させます:)



したがって、イベントが宣言されているインターフェイスがあり、キーワードevent



を削除すると、コンパイラエラーが発生します。たとえば、インターフェイスにフィールドを含めることはできません(つまり、前のイベントはデリゲートフィールドになりました)。 ただし、イベントがクラスフィールドとして宣言されている場合、コンパイラの観点からは、キーワードを削除することは完全に正しいでしょう。



したがって、質問に対する答えは次のようになります。

1.何も変わらない

2.プログラムのインターフェースで宣言されたイベントがない限り、何も変わりません。



はい、もう1つ驚くべきことです。質問に答えると、イベントがMulticastDelegate



であるとMulticastDelegate



し始めますが、 Delegate



は1つのメソッドへのリンクしか含めることができません。 一般的に、これは絶対に恐ろしい異端ですが、それにもかかわらず、いくつかの異なる人々がこの方法でこれら2つの質問に対する答えを私に与えようとしました。 この神話の由来は不明です。 MulticastDelegateとDelegateの違いを知りたい場合は、逃げてメガオーソリティのBrad Abramsの記事を見てください 。名前以外のこれらのクラスに違いがないことを確認してください。



追伸 はい、 OnDoWork()



スレッドセーフでOnDoWork()



ないことを知っています:)



All Articles