C#基础笔记(委托和事件)
委托:按我自己的理解就是将一个方法交给一个对象(不是代码意义上的对象),让这个对象去帮我调用这个方法;
委托的概念:
委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。
/// /// 定义委托/// /// delegate string Mydelegate();static void Main(string[] args){//实例化委托 调用方法GetStrMydelegate mydelegate = new Mydelegate(GetStr);//实例化委托 调用方法GetStr_1Mydelegate mydelegate1 = new Mydelegate(GetStr_1);Console.WriteLine(mydelegate());Console.WriteLine(mydelegate1());Console.ReadKey();}static string GetStr(){return "委托调用1";}static string GetStr_1(){return "委托调用2";}
委托可以让我们不用直接去调用方法体,而是通过我们创建的委托对象去调用
static void Main(string[] args){MyClassA myClassA = new MyClassA();MyClassB myClassB = new MyClassB();Console.WriteLine(myClassA.AddNum());myClassB.anum =new MyClassB.GetMyClassAnum(myClassA.AddNum);Console.WriteLine(myClassB.AddNum());Console.ReadKey();}class MyClassA{public int num = 0;public int AddNum(){return num+=1;}}class MyClassB{public int num = 10;public delegate int GetMyClassAnum();public GetMyClassAnum anum;public int AddNum(){return num+ anum();}}
这是一个不怎么恰当的例子:
定义了两个类MyClassA和MyClassB,两者都有num字段和AddNum方法,MyClassB中多了一个委托;方法也有些不相同;
再看Main方法中的调用
MyClassA myClassA = new MyClassA();MyClassB myClassB = new MyClassB();Console.WriteLine(myClassA.AddNum());myClassB.anum =new MyClassB.GetMyClassAnum(myClassA.AddNum);Console.WriteLine(myClassB.AddNum());
分别实例化两个类,并将MyClassA的方法实例化给了MyClassB的anum委托,最后打印MyClassB中AddNum方法的返回值;
上面代码要做的就是B类的AddNum方法要计算A类中num+1后的值和B类中num的和;这是使用委托实现的代码,一般情况的代码如下:
static void Main(string[] args){MyClassA myClassA = new MyClassA();MyClassB myClassB = new MyClassB();Console.WriteLine(myClassB.AddNum(myClassA.AddNum()));Console.ReadKey();}class MyClassA{public int num = 0;public int AddNum(){return num+=1;}}class MyClassB{public int num = 10;public int AddNum(int anum){return num+ anum;}}
一般情况如果要实现刚才的逻辑就需要把A类中的结果参数传递到B类中,使用委托就不需要传递这个参数了;
另外一个需求,当B类中调用AddNum方法对num加几操作时,同时也要对A类中的num做加几的操作,使用委托就可以让B在做加操作的时候自动对A做加操作,而不用我们单独调用A的增加方法,这个就和事件一样,当执行某一操作时触发某一事件。
static void Main(string[] args){MyClassA myClassA = new MyClassA();MyClassB myClassB = new MyClassB();myClassB.anum = myClassA.AddNum;myClassB.AddNum(3);myClassA.GetNum();Console.ReadKey();}class MyClassA{private int num = 0;public int AddNum(int N){return num+=N;}public void GetNum(){Console.WriteLine(num);}}class MyClassB{private int num = 10;public delegate int GetMyClassAnum(int N);public GetMyClassAnum anum;public int AddNum(int N){anum(N);return num+= N;}public void GetNum(){Console.WriteLine(num);}}
事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。
C# 中使用事件机制实现线程间的通信;
上面的代码实质上就是用委托实现了事件的功能;为什么还要单独有事件呢?我的理解是事件更安全!因为委托的公共的,你可以调用,别人也一样可以调用;在这个委托可见的地方都可以像方法一样去调用委托,这样你的委托到底是谁调用了你可能并不知道;而事件不一样,事件在其他地方是不可以像方法一样去使用的,也就是别人用不了你的事件;
更新上面代码:
static void Main(string[] args){MyClassA myClassA = new MyClassA();MyClassB myClassB = new MyClassB();myClassB.anum += myClassA.AddNum;myClassB.AddNum(3);myClassA.GetNum();Console.ReadKey();}class MyClassA{private int num = 0;public int AddNum(int N){return num+=N;}public void GetNum(){Console.WriteLine(num);}}class MyClassB{private int num = 10;public delegate int GetMyClassAnum(int N);public event GetMyClassAnum anum;public int AddNum(int N){anum(N);return num+= N;}public void GetNum(){Console.WriteLine(num);}}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
