一、委托部分 “委托”是一种指向一个类的静态方法,或者实例方法的数据结构,委托类似于 C++ 函数指针,但它是类型安全的。委托允许将方法作为参数进行传递,一旦为委托分配了方法,委托就将与该方法具有完全相同的行为。 using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { class Program { public delegate void DelCout(string str); static void Main(string[] args) { //直接传方法,在编译的时候,还是会帮我们new,这就是一个语法糖。 DelMethod(Cout,"直接传方法"); DelMethod(new DelCout(Cout),"传委托实例"); Console.Read(); } private static void DelMethod(DelCout delCout,string str) { delCout(str); } private static void Cout(string str) { Console.WriteLine(str); } } }
关于委托的两个主要作用,可能你明白事件要通过委托来实现,这是C#内部定义成这样的,但不清楚为什么回调机制也要用委托。 二、事件部分 “事件”是指当对象发生某些事情时,向其它对象提供通知的一种方法。在C#中,事件是通过delegate来实现的。 public delegate void DelDbClick(); public DelDbClick delDbClick; 那么,外部的一个类,可以做一个方法,把这个委托设置成NULL(清除监听),也可以主动触发这个委托所关联的事件(假冒事件)。这种时候就可以造成“伪造事件”。 public delegate void DelDbClick(); private DelDbClick delDbClick; public event DelDbClick AddEvent { add { delDbClick += value; } remove { delDbClick -= value; } } 像这样,把委托定义成私有的,然后定义一个这个委托类型的事件来把它向外开放。那么外部就既不能直接把委托设置成NULL,也不能直接调用委托了。 三、事件与委托之间的关联 这本来不应该单独写,但这个问题,被问得太多次了~~ 四、为会么线程交叉通信要用委托 这是我一次面试的时候,被问到的。当时,面试官问我对于多线程了解多少。我确实不清楚,但也不能一点也不说。 |
|
来自: greenyun588 > 《待分类1》