私がゲームを作っていて、基本Buff
クラスを持っているとしましょう。クラスのイベントThornsBuff
をサブスクライブするという名前のサブクラスもあるかもしれません。Player
Damaged
にはのPlayer
リストがありBuff
、そのうちの1つはThornsBuff
です。例えば:
テストクラス
Player player = new Player();
player.ActiveBuffs.Add(new ThornsBuff(player));
ThornsBuffクラス
public ThornsBuff(Player player)
{
player.DamageTaken += player_DamageTaken;
}
private void player_DamageTaken(MessagePlayerDamaged m)
{
m.Assailant.Stats.Health -= (int)(m.DamageAmount * .25);
}
これはすべて例を説明するためのものです。リストからバフを削除した場合、イベントは切り離されません。プレイヤーがバフを持っていなくても、イベントは彼が持っているかのように実行されます。
これで、イベントの登録を解除するメソッドを作成できましたが、リストからを削除するだけでなくDispel
、開発者が呼び出す必要があります。彼らが忘れたり、カップリングを増やしたりした場合はどうなりますか?Dispel
Buff
Buff
私が理解していないのは、がリストから削除されたときにイベントが自動的に切り離されない理由です。Buff
リストに存在するのは1つだけで、それが1つの参照です。それが削除された後、イベントは切り離されるべきではありませんか?
デタッチコードをのファイナライザーに追加しようとしましたが、Buff
それでも修正されませんでした。参照が0になった後でも、イベントは引き続き実行されます。ガベージコレクターがまだ実行されていなかったためだと思いますか?オブジェクトに参照がない場合にすべてのイベントが登録されないように、自動かつ瞬時に作成する方法はありますか?
ありがとう。