匿名方法是在实例化委托是内联声明的方法。

匿名函数使用位置

声明委托变量时作为初始化表达式

组合委托时在赋值语句的右边

为委托增加事件时在赋值语句的右边

匿名函数语法

1
2
3
4
5
6
7
8
9
10
    internal class Program {
static void Main(string[] args) {
MyDel del = delegate (string str) {
Console.WriteLine(str);
};
del();
}
}
delegate void MyDel(string str);
}

匿名函数不会显式声明返回值,但是实现代码必须通过返回一个与委托的返回值相同的值来匹配委托的返回类型。
当委托的参数列表不包含out参数并且匿名方法不适用任何参数时可以省略括号。

1
2
3
MyDel del = delegate {
Console.WriteLine("Hello World");
};

如果委托声明的参数列表包含了params参数,那么匿名方法的参数列表将忽略params关键字:

1
2
3
4
5
6
//定义
delegate void MyDel(int x,params int[] ints);
//声明
MyDel del = delegate (int x, int[]ints) {
...
};

匿名方法可以访问他们外围作用域的局部变量和环境。

Lambda表达式

匿名函数几乎被Lambda表达式替代了。
其语法如下:

1
2
3
MyDel del = (int x , int[] ints) => {
Console.WriteLine("Hello World");
};

编译器可以从委托的声明中知道委托参数的类型,因此Lambda表达式语序省略类型参数:

1
2
3
MyDel del = (x , ints) => {
Console.WriteLine("Hello World");
};

如果只有一个参数就可以省略两端的圆括号:

1
2
3
MyDel del = x => {
Console.WriteLine("Hello World");
};

Lambda表达式允许表达式的主题是语句块或表达式。如果语句块包含了一个返回语句,我们可以将语句块替换为return关键字后的表达式

1
MyDel del = x  => x*10;

是不是觉得这样的语法超级简洁

Lambda表达式参数列表注意事项

表达式的参数列表不一定需要包含类型,除非委托有ref或out参数。
如果只有一个参数且这个参数是隐式类型则可以省略圆括号,否则必须有括号。