
internal class PRogram { private static void Main(string[] args) { ChainDelegate(); Console.ReadKey(); } public static void ChainDelegate() { //創(chuàng)建委托 Feedback feedbackToConsole = new Feedback(FeedbackToConsole); Feedback feedbackToMsBox = new Feedback(FeedbackToMsBox); //單個委托 feedbackToConsole(1); feedbackToMsBox(2); //委托鏈 Feedback fbChain = null; fbChain += feedbackToConsole; fbChain += feedbackToMsBox; fbChain(3); } public static void FeedbackToConsole(Int32 value) { Console.WriteLine(string.Concat("FeedbackToConsole->", value)); } public static void FeedbackToMsBox(Int32 value) { Console.WriteLine(string.Concat("FeedbackToMsBox->", value)); } } //定義一個委托 internal delegate void Feedback(Int32 value);
知識點:
1.定義delegate:delegate void Feedbakc(Int32 value)
2.定義回調(diào)函數(shù)FeedbackToConsole, FeedbackToMsBox
3.創(chuàng)建委托 var feedbackToConsole=new Feedback(FeedbackToConsole)
4.調(diào)用委托
feedbackToConsole(1)
feedbackToConsole.Invoke(1)
5.委托鏈
Feed fbChain=null;
fbChain+=feedbackToConsole; fbChain=(Feedback)Delegate.Combine(fbChain,feedbackToConsole);
fbChain+=feedbackToMsBox; fbChain=(Feedback)Delegate.Combine(fbChain,feedbackToMsBox);
6.移除委托鏈中的數(shù)據(jù)(補充)
fbChain -= feedbackToConsole fbChain=(Feedback)Delegate.Remove(fbChain,feedbackToConsole);
Feedback fd1 = new Feedback(i => { Console.WriteLine(i); });
我們這樣用Lamda表達式直接代替了回調(diào)函數(shù),如果回調(diào)函數(shù)不是多個地方使用的話,我個人是比較喜歡這樣的寫法,而且我會寫成:
Feedback fd1 = new Feedback(Console.WriteLine);這塊需要大家對Lamda表達式有一定的理解。
1.泛型委托和泛型接口一樣,是有協(xié)變和逆變的(這里可以看我轉(zhuǎn)載的泛型3)
2.泛型委托我們自己一般是不需要去創(chuàng)建的,因為C#自己提供了兩種:
Action<T,......> :只帶有輸入?yún)?shù)的泛型委托(有N個重載)
Func<in TInput,......out TOutput> : 帶輸入?yún)?shù)和返回值的泛型委托(有N個重載)
3.關于EvenHandler<T>可以看一下【C#】事件
新聞熱點
疑難解答