C# 委托——Func<>
demo:
演变1
首先我们创建一下代码:
public class FuncClass
{
static int num = 0;
public static void StartYourShow()
{
while (num < 5)
{
num += 1;
Console.WriteLine("show");
}
Console.WriteLine("ShowEnd");
}
}
然后基础调用:
现在我们需要拆分这个代码:
while (num < 5)
{
num += 1;
Console.WriteLine("show");
}
Console.WriteLine("ShowEnd");
num < 5:这个是有返回值的
num += 1;Console.WriteLine(“show”);:这个是没有返回值的
Console.WriteLine(“ShowEnd”);:这个是没有返回值的
所以我们用Func<>,Action<>,Action<>来替换
demo Func和Action版本初版:
public class FuncClass
{
static int num = 0;
//public static void StartYourShow()
//{
// while (num < 5)
// {
// num += 1;
// Console.WriteLine("show");
// }
// Console.WriteLine("ShowEnd");
//}
public static void StartYourShow(Func<bool> CanEnd, Action Method, Action EndMethod)
{
while (!CanEnd())
{
Method();
}
EndMethod();
}
public static bool CanEnd()
{
if (num >= 5)
{
return true;
}
else
{
return false;
}
}
public static void Method()
{
num += 1;
Console.WriteLine("show");
}
public static void EndMethod()
{
Console.WriteLine("ShowEnd");
}
}
调用:
using 学习基础内容.Func委托;
FuncClass.StartYourShow(FuncClass.CanEnd, FuncClass.Method, FuncClass.EndMethod);
Console.Read();
demo Func和Action版本:
public static void StartYourShow
(Func<int,bool> CanEnd,Action<string> Method,Action<int,int> EndMethod)
{
while (num < 5)
{
num += 1;
Console.WriteLine("show");
}
Console.WriteLine("ShowEnd");
}
public static void GetStartYourShow()
{
StartYourShow(
(n)=> n >= 5,
(s) => { num++; Console.WriteLine("s:"+s); },
(m,n)=> Console.WriteLine(m + n)
);
}
直接调用GetStartYourShow()这个方法就行;
简单点的Func<>:
public static void getinit()
{
//定义一个Func类型返回String的无参数的委托
Func<string> func = returnstring;
Console.WriteLine(func.Invoke());
//定义一个Func类型有参数的委托
// Func<int, int, int,string> func1 =Func<int, int, int,string>(returnint);
Func<int, int, int,string> func1 = returnint;
Console.WriteLine(func1(1,2,3));
}
public static string returnstring()
{
return "测试返回string类型的Func";
}
public static string returnint(int a,int b,int c)
{
int d= a + b + c;
return d.ToString() ;
}
一般Func是和lambda一起使用的,用来自定义通用方法的
我们再来看一个案例:
int[] nums = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
int result3 = GetResult((a, b) => a + b, nums, 0, 3);
int result4 = GetResult((a, b) => a * b, nums, 0, 3);
Console.WriteLine(result3);
Console.WriteLine(result4);
//使用Func委托
static int GetResult(Func<int, int, int> func, int[] nums, int from, int to)
{
int result = nums[from];
for (int i = from + 1; i <= to; i++)
{
result = func(result, nums[i]);
}
return result;
}
Func<int, int, int> func这个作为参数就可以使用lambda表达式(a, b) => a * b,这个func你把他看成函数就容易理解了