点击访问官网 Lambda表达式 和 匿名函数
1、为什么要匿名函数
- 主要配合委托和事件使用
- 脱离委托和事件是不会使用匿名函数的
2、匿名函数基本语法
- 关键字:
delegate
delegate(参数列表)
{
// 方法体...
}
- 何时使用?
- 函数值传递委托参数时
- 委托 或 事件赋值时
3、匿名函数的使用
- 基本使用
// 1、无参无返回值
Action a = delegate ()
{
Console.WriteLine("无参无返回值*匿名函数");
};
a(); // 无参无返回值*匿名函数
// 2、有参
Action<string> b = delegate (string s)
{
Console.WriteLine("有参无返回值*匿名函数:{0}", s);
};
b("peiqi"); // 有参无返回值*匿名函数:peiqi
// 3、有返回值
Func<int, string> c = delegate (int i)
{
return "有参有返回值*匿名函数:" + i;
};
Console.WriteLine(c(250)); // 有参有返回值*匿名函数:250
- 一般作为函数参数或返回值
class Test
{
// 做参数传递
public void TestFun(string s, Action fun)
{
Console.WriteLine(s);
fun();
}
// 做返回值
public Action GetFun()
{
return delegate()
{
Console.WriteLine("he,tui~");
};
}
}
// 某方法内↓↓↓
Test t = new Test();
t.TestFun("嘎嘎嘎", delegate ()
{
Console.WriteLine("呱呱");
});
t.GetFun()();
4、匿名函数的缺点
- 添加到容器后,不记录,无法单独移除,想要移除只能清空
- 所以建议容器只存一个内容的时候再使用匿名函数
5、Lambda
此处只记录一点点简单的使用,详情请参考官网 Lambda表达式 和 匿名函数**
- 使用和匿名函数一样(可以理解为匿名函数的语法糖)
- 缺点也和匿名函数一样
// 1、无参无返回值
Action a = () => Console.WriteLine("嘎嘎");
a(); // 嘎嘎
// 2、有参
Action<string> b = (string s) => Console.WriteLine(s);
b("呱呱"); // 呱呱
// 2+、参数类型省略,和容器泛型一致
Action<string> c = s => Console.WriteLine(s);
c("呱呱+"); // 呱呱+
// 3、有返回值
Func<float, string> d = f => "返回值直接返回收到的参数:" + f;
Console.WriteLine(d(3.14f)); // 返回值直接返回收到的参数:3.14
5、闭包
- 内层函数可以引用外层函数的变量
- 注意:该变量提供的值并未其创建时的值,而是在外层函数内的最终值
class Test
{
public event Action Act;
public Test()
{
int value = 10;
// 这里就形成了闭包,构造执行完了之后value的生命周期被改变了,不会被销毁
Act = () =>
{
Console.WriteLine(value);
};
for (int i = 0; i < value; i++) {
Act += () =>
{
Console.WriteLine(i); // 调用时这里只能获得最终值
};
}
}
public void Do()
{
Act();
}
}
// 某方法内↓↓↓
Test t = new Test();
t.Do(); // 打印了十一个 10