ダンコード:
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()
ないことを知っています:)