C#事件的理解应用

时间:2022-06-01 06:55:28

之前对C#的事件理解的不够透彻,总是感觉在实际应用上差一些火候。最近写character类的相关内容,有了一些理解,在这里分享一下。

&感觉大神没必要往下看了

下面开始正式内容:

比如说,角色掉血,要显示掉血的数字,使用技能要播放特效。最直接的方式是这样写:

 public class Character
     {
         private float hp;

         public void AddHp(float _deltaHp)
         {
             hp += _deltaHp;
             CharacterEffect effect = new CharacterEffect();
             effect.PlayAddHpEffect();
         }

         public void DoSkill()
         {
             CharacterEffect effect = new CharacterEffect();
             effect.PlaySkillEffect();
         }
     }

     public class CharacterEffect
     {
         public void PlayAddHpEffect()
         {
             //Do Effect
         }

         public void PlaySkillEffect()
         {
             //DO Effect
         }
     }

现在用事件来写,是这样的:

 public class Character
     {
         public delegate void CharacterDelegate<T>(T values);
         public CharacterDelegate<float> hpChangeEvent;
         public CharacterDelegate<int> skillEvent;

         private float hp;

         public void AddHp(float _deltaHp)
         {
             hp += _deltaHp;
             if (hpChangeEvent != null)
             {
                 hpChangeEvent(hp);
             }
         }

         public void DoSkill(int _id)
         {
             if (skillEvent != null)
             {
                 skillEvent(_id);
             }
         }
     }

     public class CharacterEffect
     {
         private Character character;

         public CharacterEffect(Character _target)
         {
             character = _target;
             character.hpChangeEvent += PlayAddHpEffect;
             character.skillEvent += PlaySkillEffect;
         }

         public void PlayAddHpEffect(float _hp)
         {
             //Do Effect
         }

         public void PlaySkillEffect(int _id)
         {
             //DO Effect
         }
     }

现在对比一下两种方法:

方法一,最粗暴的方式,不过不利于维护。比如,角色血量变化的效果需要改变,这时候就需要更改你所写的数据类。这样写也让你的类变得不纯粹,类中包含其他的和自己无关的东西。

方法二,用事件来做,好处就是将耦合的地方分离。让我的存储数据的类只做存储数据的事;后期更改效果也不用对我的数据类进行任何改动,利于维护。