1. 程式人生 > 實用技巧 >C#委託、泛型委託

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)