デリゲート型は不変型です。がデリゲート型のインスタンスである場合、 1つ以上の項目D
を持つ固定長の呼び出しリストで構成されます。
したがって、リストを「クリア」することはできません。null
メソッドが存在しない場合には参照 (インスタンスではない) が使用されるため、空の呼び出しリストで新しいインスタンスを作成することもできません。
例 (MyMethod
とJonnysMethod
はメソッド グループであり、デリゲート変数ではありません):
Action D = null; // no object, no invocation list
D += MyMethod; // null and new Action(MyMethod) are combined; result is assigned to D
// D is an instance, invocation list length is 1
D += JonnysMethod; // two instances are combined; D is assigned to new instance; original instances are no longer referenced and will "soon" be garbage collected
// D is an instance, invocation list length is 2
D -= MyMethod; // D is assigned to a new instance again
D -= JonnysMethod; // D is assigned to null; no new instance
注意:D
が本当にイベントである場合は、注意してください。D
が定義され+=
ているクラス/構造体の外-=
にいて、イベントのアクセサーを呼び出している場合。したがって、この場合、それらは即時のデリゲートの組み合わせではありません。を定義するクラス/構造体の内部にいる場合D
、およびD
が「フィールドのような」イベントでD
ある場合、2 つの意味で使用できます。デリゲート変数 (イベントの「隠し」バッキング フィールド) として、およびイベントとして。+=
andの意味は-=
、2 つの方法で解釈できます。C# 3 までは、バッキング フィールドで直接デリゲートの組み合わせとして解釈されていました。C# 4 および C# 5 では、セマンティックが変更され+=
、-=
この状況でイベント アクセサーが呼び出されます。