委托与事件

1.委托

定义一个委托:  delegate void Show();

委托的执行

      委托名.invoke() 

     委托名();

    委托名。beginInvoke() // 开启一个新的线程 Core 里面不支持

2.C# 自带委托 Func 和 action  

Func<string, string> func = (a) => { return a; };  //有返回值的,先参数,最后一位返回值
string n= func.Invoke("aaaaaaaaaa");
 Action<DateTime> time = (ti) => { Console.WriteLine(ti.ToString()); };//无返回值
            time.Invoke(DateTime.Now);

3.事件

  public event Action<string> Show;  标准定义格式

下面是一个简单的事件订阅模式应用

public class Animal
    {
        private string name;
       public event EventHandler<EventArgs> NameChange;  //定义事件
            
        /// <summary>
        /// 发布者
        /// </summary>
        public string Name { get => name; set{
                if (name != value)
                {
                    AnimalEventArgs animalEventArgs = new AnimalEventArgs();
                    animalEventArgs.oldValue = name;
                    animalEventArgs.newValue = value;
                    NameChange(this, animalEventArgs);
                }
                name = value; } 
        }
      
        public void Show()
        {
            Console.WriteLine("这个Animal 内部方法");
       }
    }
  /// <summary>
        /// 事件参数
        /// </summary>
public class AnimalEventArgs : EventArgs { public string oldValue { get; set; } public string newValue { get; set; } }

/// <summary> /// 要订阅者,要做相应的变化 /// </summary>
public class master {
public void NameChange(object? sender, EventArgs e)
{ Console.WriteLine($
"宠物主人呼叫{((AnimalEventArgs)e).newValue}");//当宠物改名了,大家就叫新的名字 }
}
  static void Main(string[] args)
        {          
            Animal animal=new Animal();
            animal.NameChange += new master().NameChange;//订阅绑定事件
            animal.Name = "贝贝";
            animal.Name = "金毛";
        }

  输出结果:

      宠物主人呼叫贝贝
      宠物主人呼叫金毛

4.委托和事件的区别

事件更安全,只能在定义的类里面invoke() ,即使是子类也不可以

 

posted @ 2022-04-26 21:43  乌柒柒  阅读(31)  评论(0编辑  收藏  举报