多播委托
委托作为变量,也可以+=和-=。委托可以和方法组相加,但方法组和方法组不能相加。
储存多个函数时,调用委托会按照加的顺序依次执行。但返回值只使用最后绑定的函数。
使用 – =时,如果储存了这个值,那么会移除第一个。如果没有则无事发生。
委托是引用类型,默认值是null。委托可以和null相加,不会出现异常。
但调用null委托会发生异常。调用委托时为了保险期间,应使用Invoke方法使用委托并配合空合并运算。
Func<int, int> fun1 = Square;
fun1?.Invoke(10);
int Square(int i)
{
return i * i;
}
int Cube(int i)
{
return i * i * i;
}
匿名函数
如果一个函数的参数是一个委托类型。而你此刻没有合适的方法组使用,也不想为他专门声明一个局部函数。
则可以使用匿名函数。匿名函数的创建更为简单,语法为:返回类型 + 参数列表+ => +函数主体
Func<int, string> func = string (int i) =>
{
return i.ToString();
};
- 如果参数列表有且仅有1个参数,则可以省略参数的括号。
- 函数主体可以使用表达式语法(如果只有一句话)。
- 如果参数或返回值的类型是确定的,比如已知被赋值的变量类型,那么可以省略类型。
Fun(i => i.ToString());//因为知道这里要赋值的参数(变量)类型需要一个int类型的参数,也知道返回值是string类型。
void Fun(Func<int, string> func)
{
Console.WriteLine(func);
}
匿名函数每次取值时会创建一个新的值。而多播委托必须要原值才能解绑。
也就是说多播委托无法使用匿名函数进行解绑。
Func<int, string> func = i => i.ToString();
func -= i => i.ToString();//无事发生