C#中的数据类型 函数数据类型
Action 是一个数据类型 但是是没有返回值得函数数据类型
Func 用于指定一个有返回值的委托
internal class Program{static void Main(string[] args){TT.F1(NoVoid);TT.F2(Void1);Void2(() => { Console.WriteLine("Void2执行了"); });}static void NoVoid(){}static void Void1(int i){Console.WriteLine("值是"+i);}static void Void2(Action act){Console.WriteLine("正在执行Void2");act(); //回调 这个委托方法}}class TT{public static void F1(Action act) { }public static void F2(Action<int> act) { }}
delegate和Action的写法
delegate写法
public delegate void MyDelegate(string str);static void Main(string[] args){MyDelegate myDelegate = new MyDelegate(Sum);myDelegate("123");}static void Sum(string str){Console.WriteLine(str);}
修改为 Action写法
static void Main(string[] args){Action<int> i = Void1;i(5);}static void Void1(int i){Console.WriteLine("i的值是"+i);}
Action的写法更简洁
Func
Func是有返回值的
Func<T1>(有返回值) --------T1为返回值的类型,无参数类型
Func<T1,T2>(有返回值)-----T1是参数类型,T2是返回值类型
Func<T1,T2,T3>(有返回值)--T1和T2是参数类型,T3是返回值类型
代码示例
internal class Program
{static void Main(string[] args){Test.Fn1(fn1);Test.Fn2(fn2);}static int fn1(){return 12;}static string fn2(int a){return "123456";}
}
class Test
{public static void Fn1(Func<int> fn) { }public static void Fn2(Func<int,string> fn) { }
}
Lambda表达式
Func<int,int>fn3=y=>y;Action<int, int> fn2 = (int x, int y) =>{Console.WriteLine(x + y);};
Func和泛型委托(4种方法)
delegate bool CallBack(string a);delegate bool CallBack<T>(T obj);internal class Program{static void Main(string[] args){//查询是张字开头的string[] names = { "花木兰", "蒙恬", "白起", "张飞", "马超" };Console.WriteLine(Test.Main1(names, Fn1));Console.WriteLine(Test.Main2<string>(names, Fn1));Console.WriteLine(Test.Main3(names, Fn1));Console.WriteLine(Test.Main4<string>(names,Fn1));Console.WriteLine(Test.MyIndex(names,Fn1));}public static bool Fn1(string s){return s.StartsWith("张");}}class Test{public static string Main1(string[] args,Func<string,bool>f){for (int i = 0; i < args.Length; i++){if(f(args[i])){return args[i];}}return default;}public static T Main2<T>(T[]args,Func<T,bool>f){for(int i = 0;i < args.Length;i++){if (f(args[i])){return args[i];}}return default;}public static string Main3(string[]args,CallBack f){for (int i = 0; i < args.Length; i++){if (f(args[i])){return args[i];}}return default;}public static T Main4<T>(T[]args,CallBack<T> f){for (int i = 0; i < args.Length; i++){if (f(args[i])){return args[i];}}return default(T);}public static int MyIndex(string[] arrs, Func<string, bool> f){for (int i = 0; i < arrs.Length; i++){if (f(arrs[i])){return i;}}return -1;}}