1、Delegate,委托的鼻祖

protected delegate int ClassDelegate(int x, int y);//定义委托类型及参数
static void Main(string[] args)
{
ClassDelegate dele = new ClassDelegate(Add);//实例化一个委托
Console.WriteLine(dele(1, 2));//调用委托
Console.ReadKey();
}
static int Add(int a, int b)
{
return a + b;
}

2、Action,可以传入参数,没有返回值的委托
方法1,调用方法

static void Main(string[] args)
{
Action<int, int> ac = new Action<int, int>(ShowAddResult);//实例化一个委托
ac(1, 2);//调用委托
Console.ReadKey();
}
static void ShowAddResult(int a, int b)
{
Console.WriteLine(a + b);
}

方法2,使用lambda表达式

static void Main(string[] args)
{
Action<int, int> ac = ((p, q) => Console.WriteLine(p + q));//实例化一个委托
ac(1, 2);//调用委托
Console.ReadKey();
}

方法3,作为参数传

static void Main(string[] args)
{
Action<string> ac = (p => Console.WriteLine("我是方法1,传入值:"+p));//实例化一个委托
Action<string> ac2 = (p => Console.WriteLine("我是方法2,传入值:" + p));//实例化另一个委托
Test(ac, "参数1");//调用test方法,传入委托参数
Test(ac2, "参数1");//调用test方法,传入委托参数
Console.ReadKey();
}
static void Test<T>(Action<T> ac, T inputParam)
{
ac(inputParam);
}

3、Func,可以传入参数,必须有返回值的委托
方法1,调用方法

static void Main(string[] args)
{
Func<string> fc1 = new Func<string>(ShowAddResult);//实例化一个委托
string result = fc1();//调用委托
Console.WriteLine(result);
Console.ReadKey();
}
static string ShowAddResult()
{
return "地球是圆的";
}

方法2,使用lambda表达式

static void Main(string[] args)
{
//实例化一个委托,注意不加大括号,写的值就是返回值,不能带return
Func<string> fc1 = () => "地球是圆的";
//实例化另一个委托,注意加大括号后可以写多行代码,但是必须带return
Func<string> fc2 = () =>
{
return "地球是圆的";
};
string result = fc1();//调用委托
string result2 = fc2();//调用委托
Console.WriteLine(result);
Console.WriteLine(result2);
Console.ReadKey();
}

方法3,作为参数传

static void Main(string[] args)
{
//实例化一个委托,注意不加大括号,写的值就是返回值,不能带return
Func<int, string> fc1 = (p) => "传入参数" + p + ",地球是圆的";
//实例化另一个委托,注意加大括号后可以写多行代码,但是必须带return
Func<string, string> fc2 = (p) =>
{
return "传入参数" + p + ",地球是圆的";
};
string result = Test<int>(fc1, 1);//调用委托
string result2 = Test<string>(fc2, "1");//调用委托
Console.WriteLine(result);
Console.WriteLine(result2);
Console.ReadKey();
}
static string Test<T>(Func<T, string> fc, T inputParam)
{
return fc(inputParam);
}

总结:
Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型
Func可以接受0个至16个传入参数,必须具有返回值
Action可以接受0个至16个传入参数,无返回值
本文深入解析C#中的委托概念,包括Delegate、Action和Func的使用方法。通过实例演示了如何定义、实例化和调用不同类型的委托,以及如何利用lambda表达式简化委托的创建过程。
459

被折叠的 条评论
为什么被折叠?



