1)Fun委托
委托添加多个事件(委托的多播或组播),委托包含返回值时,仅得到最后向委托添加的事件(方法)的返回值,所以在使用有返回值时必须注意这一点。
public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
//Func至少0个输入参数,至多16个输入参数,根据返回值泛型返回。必须有返回值,不可void。
//Func<int> 表示没有输入参参,返回值为int类型的委托。
//Func<object,string,int> 表示传入参数为object, string ,返回值为int类型的委托。
//Func<object,string,int> 表示传入参数为object, string, 返回值为int类型的委托。
//Func<T1,T2,,T3,int> 表示传入参数为T1,T2,,T3(泛型),返回值为int类型的委托。
//返回值类型写在泛型类型的最后
//有一个参数,一个返回值
Func<int, int> fun4 = new Func<int, int>(FunWithPara);
int result4 = fun4(4);
Console.WriteLine($"这里是一个参数一个返回值的方法,返回值是:{result4}");
Console.WriteLine("----------------------------");
// 使用委托
Func<int, string> fun5 = delegate (int i) { return i.ToString(); };
string result5 = fun5(5);
Console.WriteLine($"这里是一个参数一个返回值的委托,返回值是:{result5}");
Console.WriteLine("----------------------------");
// 使用匿名委托
Func<int, string> fun6 = (int i) =>
{
return i.ToString();
};
2)Action委托
含义:没有返回值,可以不包含参数
(1)声明委托、定位委托事件、向委托添加事件、执行委托
/// <summary>
/// 不包含参数
/// </summary>
private event Action Action_0;
/// <summary>
/// 包含一个参数
/// </summary>
private event Action<int> Action_1;
/// <summary>
/// 包含两个参数
/// </summary>
private event Action<int, double> Action_2;
/// <summary>
/// 包含三个参数
/// </summary>
private event Action<int, double, string> Action_3;
/// <summary>
/// 定义没有参数委托的事件
/// </summary>
private void Fun_0()
{
Console.WriteLine("没有参数");
}
/// <summary>
/// 定义包含一个参数委托的事件
/// </summary>
private void Fun_1(int nInt)
{
Console.WriteLine($"包含一个参数:{nInt}");
}
/// <summary>
/// 定义包含两个参数委托的事件
/// </summary>
private void Fun_2(int nInt, double dDouble)
{
Console.WriteLine($"包含两个参数,参数值:{nInt},{dDouble}");
}
/// <summary>
/// 定义包含三个参数委托的事件
/// </summary>
private void Fun_3(int nInt, double dDouble, string str)
{
Console.WriteLine($"包含三个参数,参数值:{nInt},{dDouble},{str}");
}
//点击事件
private void btn_Click(object sender, EventArgs e)
{
//向委托添加事件
Action_0 += Fun_0;
Action_1 += Fun_1;
Action_2 += Fun_2;
Action_3 += Fun_3;
//执行委托
Action_0.Invoke();
Action_1.Invoke(666);
Action_2.Invoke(666,888.0);
Action_3.Invoke(666,888,"Hello World");
}