前文: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();
}
}