zoukankan      html  css  js  c++  java
  • c#中的委托和事件

    1.委托

    相当于c++中的函数指针  指针-->委托

    方法作为参数 委托来接受  即委托指向该方法

    委托作用:将方法变成和基本的数据类型一样 可以当参数传递,作为返回值,赋值等

    例子:

    委托声明

    1)delegate void  delegateFun1(int a,float b)  //带参数不带返回值

    2)delegate bool delegateFun2() //不带参数带返回值

    3)delegate bool delegateFun3(int a,int b)//带参数和返回值

    委托实例化

    void fun1(int a,float b)

    {

      ...

    }

    1) delegateFun1 f1=new delegateFun1(fun1)

    2)delegateFun1 f2=fun1;

    3)

      delegateFun1 f3; 

      f3=fun1;

       f3+=fun2;//多播委托  委托内部就是一个数组

    实际上使用+=符号的时候会判断
    如果此时委托还没有实例化(委托实例为null),它会自动用+=右边的函数实例化委托
    如果此时委托已经实例化,它会只把+=右边的函数注册到委托实例上

    匿名函数初始化委托

    delegateFun3 f4 =deleagte(int a,int b){

      ...

    };

    labmda表达式 用在委托中替换匿名函数

    delegateFun3 f4 =(int a,int b)=>{return a+b}

    delegateFun3 f4 =(a,b)=>{return a+b}//进一步简化

    泛型委托(广泛使用)

    1)Action<T>  //带参数无返回值的委托

    2)Fun<T,TResult>  //带参数必须有返回值的委托

    泛型委托的使用(一般结合lambda表达式使用)

    Action泛型委托原理 public delegate void Action(T)

    Func泛型委托原理 public delegate TResult Func(T,out Result)

    Action f5=()=>{Console.WriteLine("...");}//无参数无返回值的泛型委托

    Action<int,int> f6=(int a,int b)=>{Console.WriteLine("123");}//带参数无返回值的泛型委托

    Action<int,int> f7=(a,b)={...};

    Func<string> f8=()=>{return "123";}//

    Func<int,string> f9=(int a)=>{return "2222";};

    Func<int,string,bool>=(int a,string s)=>{return true;}

    2.事件

    c#事件定义  public event DelegateFun checkEvent;

    使用步骤: 声明事件->实例化事件->注册函数到事件

    事件和委托的关系:事件就是经过封装的委托

    事件使用要点

    delegate void DelegateFun(int a);

    1.不用判空  if(delegate!=null)

    2. 不能用'='实例化只能用+=初始化 用'='会出错

     

    3.在类的内部,无论声明是protected还是public,都是private 封装性良好,防止外部访问

  • 相关阅读:
    阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:8. 委托事件
    阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:7. 服务调用
    Git
    Git
    Git
    Git
    Git
    Git
    Git
    Delphi
  • 原文地址:https://www.cnblogs.com/lt123/p/6706108.html
Copyright © 2011-2022 走看看