C#基础17:匿名方法与Lambda表达式

前文:https://blog.csdn.net/Jaihk662/article/details/96895681(委托)

一、匿名方法

匿名方法:字面理解,没有名字(名字省略)的方法。在开发过程中,有些方法非常简单因此就根本没有必要专门定义成一个方法,从此就出现了匿名方法

根据前文第二个例子“多播委托”,修改其代码,将其中的Add()方法换成匿名方法如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public delegate int Func(int a, int b);         //声明一个委托
public class Subject : MonoBehaviour
{
    private void Start()
    {
        Func func;
        func = delegate(int a, int b)
        {
            Debug.Log("执行匿名函数,这个匿名函数原为Add()");
            return a + b;
        };              //别忘记加分号!!
        func += Mul;
        Debug.Log(func(3, 5));          //fun(3,5)会依次执行Add、Mul两个方法,返回值为最后一个方法的返回值
    }

    public int Mul(int a, int b)
    {
        Debug.Log("执行函数Mul");
        return a * b;
    }
}

二、Lambda表达式

为什么Lambda表达式要和匿名方法一起提,因为Lambda其实就是匿名方法的再简化版

也就是说:定义方法太麻烦没必要?→ 出现了匿名方法,可以省略掉方法名,但还是不够简洁?→ Lambda表达式

一个非常全面的例子如下图:

可以看出Lambda表达式的语法如下:

委托类型  变量  =  ([参数列表])  =>  {  方法体;  };

  • => 是 Lambda 表达式特有符号,读音为 "goes to"
  • 如果参数列表中有且只有一个参数,() 可以省略,没有参数的话不能省略,例子: () => {  方法体;  };
  • 如果方法体内只有一句代码,可以省略代码块符号,也就是不用写 { }
  • {  方法体;  } 这部分当然可以像写一般方法那样换行

具体代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public delegate int Func(int a, int b);         //声明一个委托
public delegate int Test(int x);
public delegate void Pri();
public class Subject : MonoBehaviour
{
    private void Start()
    {
        Func func;
        func = delegate (int a, int b)    {  Debug.Log("执行匿名函数,求两个数字之和");  return a + b;  };     //匿名方法
        func +=         (int a, int b) => {  Debug.Log("执行对应Lambda表达式");          return a + b;  };     //Lambda表达式
        func +=         (    a,     b) => {  Debug.Log("Lambda表达式可以省略参数类型");  return a + b;  };     //Lambda表达式

        Test lamd;
        lamd = delegate (int x)    {  Debug.Log("执行匿名函数,返回当前数+1");                  return x + 1;  };     //匿名方法
        lamd +=         (int x) => {  Debug.Log("执行对应Lambda表达式");                        return x + 1;  };     //Lambda表达式
        lamd +=         (    x) => {  Debug.Log("Lambda表达式可以省略参数类型");                return x + 1;  };     //Lambda表达式
        lamd +=              x  => {  Debug.Log("如果参数列表有且只有一个参数还可省略小括号");  return x + 1;  };     //Lambda表达式
        lamd +=              x  =>    /*如果方法体内只有一句代码,更可以省略大括号和 return */         x + 1;         //Lambda表达式

        Pri PriOnly;
        PriOnly = () => Debug.Log("Hello world");

        Debug.Log(func(3, 6));
        Debug.Log(lamd(100));
        PriOnly();
    }
}
原创文章 1134 获赞 1439 访问量 61万+

猜你喜欢

转载自blog.csdn.net/Jaihk662/article/details/97130647
今日推荐