atsukanrockのブログ

Microsoft系技術を中心にぼちぼち更新します

Delegate(およびMulticastDelegate)はimmutable(不変)である

要旨

Delegate(およびMulticastDelegate)クラスのオブジェクトはimmutable(不変)である。immutableであるということは、スレッドセーフである(同一オブジェクトが複数スレッドからアクセスされても安全である)ということだ。

ちなみに

イベントとなると話は別である。イベントには、必ずイベントハンドラの追加と削除が可能となる。逆に言うと、イベントハンドラの追加や削除ができないイベントは公開できない。例えば以下のコードでは、FugaイベントもPiyoイベントもコンパイルエラーとなる。

public class Hoge
{
    // addもremoveも許可しない
    public event EventHandler Fuga
    {
    }

    // addとremoveをprivateにする
    public event EventHandler Piyo
    {
        private add {}
        private remove {}
    }
}

よって、イベントを公開するクラスをimmutableとすることはできない。つまり、イベントを公開するクラスのオブジェクトをスレッドセーフに扱うのは、クラス利用者の責任だということだ。