C#委託、泛型委託
一、一個委託是一個指向一個方法的引用,或者說,一個委託的例項就是一個指向某個方法的物件,這是一個簡單卻十分強大的概念。
有引數的方法中,我們把另一個方法當作引數傳進來,那麼這個方法的型別就是委託型別。
委託所指向的函式必須跟委託具有相同的簽名;我們可以把一個函式賦值給委託,前提是這個函式的簽名必須跟委託是一樣的
1.宣告委託的關鍵詞是delegate
Delegate至少0個引數,至多32個引數,可以無返回值,也可以指定返回值型別。
例:publicdelegateintMethodtDelegate(intx,inty);表示有兩個引數,並返回int型。
class Program
{
// 宣告一個委託指向相同簽名的2個函式SayHiChinese,SayHiEnglish
public delegate void DelSayHi(string name);
static void Main(string[] args)
{
SayHi("張三",SayHiChinese);//把函式當成引數直接傳進來
Console.ReadKey();
//另一種呼叫方式,這種情況可以不用寫SayHi函數了
DelSayHi del=SayHiChinese;
Del(“張三”);
Console.ReadKey();
//第三種方法,可以使用匿名函式,匿名函式的簽名也要跟委託一樣
DelSayHi del = delegate (string name){ Console.WriteLine("你好" + name); };
//第四種方法lamda表示式 => goes to
DelSayHi del = (string name) => { Console.WriteLine("你好" + name); };
del("張三");
Console.ReadKey();
}
public static void SayHi(string name, DelSayHi del)//委託型別的引數就是函式
{
del(name);
}
public static void SayHiChinese(string name)
{
Console.WriteLine("你好" + name);
}
public static void SayHiEnglish(string name)
{
Console.WriteLine("Hello" + name);
}
}
二、泛型委託
(1).Func
Func是有返回值的泛型委託
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至少0個引數,至多16個引數,根據返回值泛型返回。必須有返回值,不可void
Func<int, int> func = (a) => { return a; };
Console.WriteLine(func(8));
//輸出:8
(2). Action
Action是無返回值的泛型委託。
Action 表示無參,無返回值的委託
Action<int,string> 表示有傳入引數int,string無返回值的委託
Action<int,string,bool> 表示有傳入引數int,string,bool無返回值的委託
Action<int,int,int,int> 表示有傳入4個int型引數,無返回值的委託
Action至少0個引數,至多16個引數,無返回值。
Action<string> act = (a) => Console.WriteLine("hello world"+a);
act("北京");
//輸出:hello world 北京
(3) .predicate
predicate 是返回bool型的泛型委託
predicate<int> 表示傳入引數為int 返回bool的委託
Predicate有且只有一個引數,返回值固定為bool
例:publicdelegateboolPredicate<T> (T obj)