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;}}