present@わんくま

本家はこちら

目次

Blog 利用状況

ニュース

アクセサリ

書庫

日記カテゴリ

ギャラリ

リンク

イベントを発生させるメソッドの実装(2)

イベントとイベントを発生させるメソッドを

public class Sample
{
    public Sample()
    {
        // 何もしないイベントハンドラを1個登録しておく。
        Hello = delegate {};
    }

    public event EventHandler<HelloEventArgs> Hello;

    protected virtual void OnHello(HelloEventArgs e)
    {
        // クラス内部で null を代入しないかぎり、
        // Hello は null にならない。
        Hello(this, e);
    }
}

という風に実装しているコードを見かけた。

なるほど。これならイベントハンドラを外部から -= で全て登録解除されても NullReferenceException は発生しないな。

メモしておこう.......φ(..)メモメモ

投稿日時 : 2008年11月25日 9:38

コメントを追加

# re: イベントを発生させるメソッドの実装(2) 2008/11/25 10:24 R・田中一郎

面白いですね。
僕も使ってみようかな、と思ったのですが、ちょっと疑問に思った点が 2 つあります。

外部で Hello を null にされることはないのでしょうか?

if (Hello != null) Hello(this, e);
ではいけない理由は、どのようなものがあるのでしょうか?

# re: イベントを発生させるメソッドの実装(2) 2008/11/25 11:40 なかむら

>外部で Hello を null にされることはないのでしょうか?

Sample s = new Sample();
s.Hello = null;

というコードはビルドできませんし、

s.Hello -= delegate{};
s.Hello -= new EventHandler<HelloEventArgs>(s_Hello);

などと記述しても Hello は null になりません。

Hello を null にするメソッドを提供すれば、外部から null にできますが、そんな場面はほとんど無いでしょう。

# re: イベントを発生させるメソッドの実装(2) 2008/11/25 11:49 なかむら

>if (Hello != null) Hello(this, e);
>ではいけない理由は、どのようなものがあるのでしょうか?

“いけない”とまでは思っていませんが、
「別のスレッドでイベントハンドラを全て登録解除
→NullReferenceException 発生」
という例を以前エントリに書きました。

http://blogs.wankuma.com/nakamura/archive/2008/10/23/159676.aspx

# re: イベントを発生させるメソッドの実装(2) 2008/11/25 12:59 黒龍

nullチェックを端折りたいがために定義箇所でデフォルト書くようにしてます。

EventHandler<HelloEventArgs> Hello = delegate {};
みたいな。

頻繁に呼び出されるイベントだとわずかながら速度に響くのと通常使用する場合はnullにならないのにチェックする違和感(このへんはC++での参照の感覚といっしょ)からこうしてますね。

# イベントに空デリゲートを仕込ませてみる 2008/11/25 14:10 R.Tanaka.Ichiro's Blog

イベントに空デリゲートを仕込ませてみる

# re: イベントを発生させるメソッドの実装(2) 2008/11/25 18:38 通りすがり

いわゆる"Nullオブジェクトパターン"ですね

# re: イベントを発生させるメソッドの実装(2) 2008/12/04 11:54 aetos

リフレクション使ったらクラス外から null にできたよ\(^o^)/

# DRPAUaufLzMYytFevG 2021/07/03 3:33 https://amzn.to/365xyVY

Yay google is my world beater assisted me to find this great site!.

# YBlnuVzbFiHWoOcGzzj 2021/07/03 5:03 https://www.blogger.com/profile/060647091882378654

Nuvoryn test Since the MSM is totally skewed, what blogs/websites have you found that give you information that the MSM ignores?.

# can you buy stromectol over the counter http://stromectolabc.com/
ivermectin cream 2022/02/07 17:58 Busjdhj

can you buy stromectol over the counter http://stromectolabc.com/
ivermectin cream

# ivermectin australia http://stromectolabc.com/
ivermectin buy online 2022/02/08 10:31 Busjdhj

ivermectin australia http://stromectolabc.com/
ivermectin buy online

# ivermectin cost 2022/02/22 2:23 Stevenfrade

https://stromectolis.com/# ivermectin 12

# ivermectin 1 topical cream 2022/02/22 12:22 Stevenfrade

https://stromectolis.com/# ivermectin 3 mg

# doxycycline mono https://doxycyline1st.com/
doxy 200 2022/02/25 22:37 Doxycycline

doxycycline mono https://doxycyline1st.com/
doxy 200

# doxycycline 150 mg https://doxycyline1st.com/
doxycycline 100mg online 2022/02/26 9:51 Doxycycline

doxycycline 150 mg https://doxycyline1st.com/
doxycycline 100mg online

# doors2.txt;1 2023/03/14 15:34 IoecVyHjNBdw

doors2.txt;1

タイトル
名前
URL
コメント