C# 事件与委托

时间:2022-03-12 05:49:06

一些小概念,防止自己太久不用忘记了

 
事件委托:
Action <int, int, string ….(max number of 16 parameters )> a
永远没有返回值,最多16个泛型输入参数
e.g.:
Static void PrintStr(string str){
     Console.WriteLine(str);
}
Action<string> a=PrintStr;
 
 
函数委托:
Func <int,double, string…. >
必须有返回值,参数类型最多有16个
e.g.:
Static int test(string str){
  Console.WriteLine(str);
   Return 1;
}
Func<string, int> a=test;//Func <>后面可以有很多类型, 最后一个是返回值类型,其余是参数类型
Console.ReadKey();
 
 
多播委托:
一个委托引用多个方法
e.g.:
Static void test1(){
     Console.WriteLine(“test1”);
}
Static void test2(){
     Console.WriteLine(“test2”);
}
Action a = test1;
a +=test2;//表示添加一个委托的引用
//a -=test1; //删除test1的引用
多播委托的遍历
 
 
匿名方法:
Static int test (int arg1, int arg 2){
    Return arg1+arg2;
}
Func <int, int, int> a= test;
和下面的匿名方法是等价的;
Func <int,int,int> a=delegate (int arg1, int arg2){
    Return arg1+arg2;
}
 
 
lambda表达式:
lambda表达式用来代替匿名方法,所以一个lambda表达式也是定义了一个方法
Func<int, int, int> plus =(arg1, arg2) =>//lambda 表达式不需要声明参数类型
{
      Return arg1+arg2;
 
 
观察者模式:
假设猫是被观察者,老鼠是观察者
 
class Cat{
    private string color;
    private string name;
    public void Cat(string color, string name){
        this.name=name;
        this.color=color;
    }
    public void CatComing(){
        Console.WriteLine("cat"+name+"is coming");
        if(catCome!=null)
        catCome();
    }
    public Action catCome;
}
 
class Mouse{
    private string name;
    private string color;
    public void Mouse(string color, string name){
        this.name=name;
        this.color=color;
    }
    public void RunAway(){
        Console.WriteLine("mouse"+name+"runs away");
    }
}
 
namespace{
    class Program{
        static void Main(string[] args){
            Cat cat=new Cat("Blue","Tom");
            Mouse mouse1 =new Mouse("Yellow","Jerry");
            cat.catCome+=mouse1.RunAway;//注册
            Mouse mouse2 =new Mouse("Black","Micky");
            cat.catCome+=mouse2.RunAway;//注册
            cat.CatComing();
            Console.ReadKey();
        }
    }
}
 
 
事件: