internal class Program { private static void Main(string[] args) { ChainDelegate(); Console.ReadKey(); } public static void ChainDelegate() { //创建委托 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);View Code
知识点:
1.定义delegate:delegate void Feedbakc(Int32 value)
2.定义回调函数FeedbackToConsole, FeedbackToMsBox
3.创建委托 var feedbackToConsole=new Feedback(FeedbackToConsole)
4.调用委托
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.移除委托链中的数据(补充)
fbChain -= feedbackToConsole fbChain=(Feedback)Delegate.Remove(fbChain,feedbackToConsole);
Feedback fd1 = new Feedback(i => { Console.WriteLine(i); });
我们这样用Lamda表达式直接代替了回调函数,如果回调函数不是多个地方使用的话,我个人是比较喜欢这样的写法,而且我会写成:
Feedback fd1 = new Feedback(Console.WriteLine);
这块需要大家对Lamda表达式有一定的理解。
1.泛型委托和泛型接口一样,是有协变和逆变的(这里可以看我转载的泛型3)
2.泛型委托我们自己一般是不需要去创建的,因为C#自己提供了两种:
Action<T,......> :只带有输入参数的泛型委托(有N个重载)
Func<in TInput,......out TOutput> : 带输入参数和返回值的泛型委托(有N个重载)
3.关于EvenHandler<T>可以看一下【C#】事件