委托、匿名方法、Action、Func、Lambda个人笔记

A:委托

      微软msdn上解释说:委是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。 在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联。

对于这句话只能慢慢体会,项目写多了,coding多就会慢慢体会其中含义。

     既然有委托那么如果调用微软msdn又解释说:对委托进行实例化后,委托会将对其进行的方法调用传递到该方法。 调用方传递到委托的参数将传递到该方法,并且委托会将方法的返回值(如果有)返回到调用方。 这被称为调用委托。 实例化的委托可以按封装的方法本身进行调用。

     有定义,有调用那为什么微软要使用委托这种类型方法?看到微软官网上说在那种情况下使用委托:

     在下列情况下使用委托:

  • 使用事件的设计模式。

  • 最好封装一个静态方法。

  • 调用方不需要访问实现该方法的对象上的其他属性、方法或接口。

  • 容易的组合是需要的。

  • 类可能需要方法的多个实现。

  • 委托是事件的基础。

    那不言而喻了,最主要的是在事件的设计模式中会用到。

    委托定义:

        委托定义有关键字Delegate ,委托类型的声明与方法签名相似。 它有一个返回值和任意数目任意类型的参数

delegate void 委托();
delegate void 参数委托(string Msg);
public void 委托方法()
{
   委托 委托1 = new 委托(委托要调用的方法);
   委托1();
}

public void 委托要调用的方法()
{
   MessageBox.Show("委托要调用的方法");
}

public void 委托参数方法(string Msg)
{
   参数委托 委托2 = new 参数委托(委托参数要调用的方法);
   委托2(Msg);
}

public void 委托参数要调用的方法(string Msg)
{
   MessageBox.Show("参数返回值" + Msg);
}

B:匿名方法

      匿名方法是委托的另一种表现方式,创建匿名方法实际上是一种将代码块作为委托参数传递的方式,由于使用匿名方法无需创建单独的方法,因此可减少对委托进行实例化的编码开销。

      匿名方法定义:

          Delegate(无参或者有参){方法体};

          参数的有无要与所定义的委托相对应

delegate void 匿名方法(string Msg);
delegate void 匿名方法无参数();
  
 public void 匿名方法例子()
    {
            匿名方法 匿名 = delegate (string msg)
              {
                  MessageBox.Show(msg);
              };

            匿名("匿名");
  }

  public void 匿名方法无参数例子()
  {
            匿名方法无参数 st = delegate () { SayHello(); SayHello1(); };
            st();
  }

C:Action委托

    此委托可用于将方法作为参数传递而不用显式声明自定义委托。 封装的方法必须对应于此委托定义方法签名。 这意味着,封装的方法必须具有任何参数,没有返回值

    Action定义:

      有关键字Action

public void Action例子()
        {
            Action ac = new Action(SayHello);
            ac();
        }
public void Action泛型例子()
        {
            Action<int, int> acadd = new Action<int, int>(ActionAdd加法);
            acadd(1, 2);
        }

D:Func委托

     可以使用此委托来表示的方法,而无需显式声明自定义的委托作为参数进行传递。 封装的方法必须对应于此委托定义的方法签名。

public void Func例子()
        {
            Func<int, int, int> FuncAdd = new Func<int, int, int>(FuncAdd加法);
            MessageBox.Show(FuncAdd加法(5, 5).ToString());
        }

public int FuncAdd加法(int x, int y)
        {
            return x + y;
        }

E:Lambda拉姆达表达式

   Lambda 表达式是一种可用于创建 委托表达式目录树 类型的 匿名函数 。 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数。

   表达式位于 => 运算符右侧的 Lambda 表达式称为“表达式 lambda”。 表达式 lambda 广泛用于表达式树的构造。 表达式 lambda 会返回表达式的结果,并采用以下基本形式:

   (input-parameters) => expression

   仅当 lambda 只有一个输入参数时,括号才是可选的;否则括号是必需的。 括号内的两个或更多输入参数使用逗号加以分隔:

    (x, y) => x == y

   而以上的所有委托都能用拉姆达表达式来实现:

          //常见委托写法
            委托 委托1 = () => 委托要调用的方法();
            委托1();

            //两种写法
            参数委托 委托2 = (string msg) => 委托参数方法(msg);
            委托2("msg");
            参数委托 委托3 = msg => { 委托参数方法(msg); };
            委托3("msg");

            //匿名方法
            匿名方法无参数 委托4 = () => { SayHello(); SayHello1(); };

            匿名方法 委托5 = msg => { SayHello(); SayHello1(); };
            //Action委托
            Action<int, int> action = (int x, int y) => ActionAdd加法(x, y);
            action(5, 8);
            //Func委托
            Func<int, int, int> func = (int x, int y) => FuncAdd加法(x, y);
            func(8, 9).ToString();

转载于:https://www.cnblogs.com/hahablog/p/8072974.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值