C# 关于事件 委托的理解
来源:互联网 发布:光纤交换机端口类型 编辑:程序博客网 时间:2024/05/20 08:00
C#看起来有点绕的感觉,不像c++那样严谨,类的定义,C#的方法,不是一个类型,只是其他类型的成员变量。还有C#必须是一个强类型的语言,参数类型都要加上前缀,比如:
public void print(int){…},所以一个方法不能直接作为其他方法的参数。把一个方法名作为参数,无法制定类型,干脆传对象,然后执行方法。
using System;namespace MyEventTest{public class SomeClass{public void Start(int a) { Console.WriteLine("Go:{0}",a); }}public class Publisher{public void StartEvent(int a, SomeClass sc){if (sc != null){sc.Start(a); //start function}}}public class MainClass{static void Main(){SomeClass some = new SomeClass();Publisher p = new Publisher();p.StartEvent(5,some); //Go:5}}}
—————以上方法可以实现,但不是最好的做法。
委托:
public void start(int a){Console.WriteLine(“Go:{0}”,a);}
定义一个委托类型:
public delegate void Mydel(int a);
定义Model是一个类型,委托在后台实现该派生自System.Delegate类。
定义委托,告诉编译器委托讲表示哪种方法(返回值+方法签名),该方法可以为任意类型的实例方法,静态方法,确保返回值类型和委托匹配,那就可以实例,可以引用这些方法。
必须创建该委托的实例,为它指定要引用的方法,如:
Model d = some.start;
+ ,+= -,-= 表示添加更多的方法引用,删除引用;
2;
事件:EventHandle
public delegate void EventHandle(object sender,EventArgs e)//EventArgs 主要用来存储事件数据
public delegate void EventHandle(object sender,EventArgs e);
first step:
public class MyEventArgs:EventArgs{public int Current{get;set;}}public class Publisher{public event EventHandle<MyEventArgs>MyEvent;//实例化事件public int Sum(get;set;)public void StartEvnet(int a){var EventCopy = MyEvent;//每次取一个副本MyEventArg args = new MyEventArgs();args.Current = a;this.Sum += a;if (EventCopy ! = null){EventCopy(this,args)//调用事件}}}
second step:
public class Subscriber{public void Dosomething(object obj,MyEvnetArgs){Publisher p = (Publisher)obj;Console.WriteLine("Meg:Sum = {0},Current = {1}",p.sum,e.Current);}public void Dosomething2(object obj,MyEventArgs e){}}
third step:
public class MainClass {static void Main(){Publisher p = new Publisher{Sum = 0Subscriber sub = new Subscriber();p.MyEvent ++ sub.Dosomething1;//注册回调方法p.MyEvent += sub.Dosomethin2;p.StartEvnet(5); //调用方法,间接触发事件p.MyEvent -= sub.Dosomething;//取消注册}}}
难点分析:
1,在发布者类中实例化委托事件,并定义一个实例方法,用来调用委托事件 ,先定义一个用来存储事件数据的类
2,定义订阅者类,在该类中定义和委托事件相匹配的方法(事件触发时,实际要执行的方法)
3,在客户端代码中,在发布者类的实例上为委托事件注册回调方法
***
事件对象就是一个委托对象,把事件看作委托,就好理解了,Event 这个单词很忽悠人。
- C# 关于事件 委托的理解
- 关于C#委托和事件的粗浅理解
- C#委托、事件、自定义事件的理解
- C#委托、事件、自定义事件的理解
- 关于C# 委托的理解
- c#委托、事件理解
- C#委托事件理解
- C# 中的委托和事件的理解
- 关于 C# 委托、事件
- 对C#委托及事件委托的理解
- C#委托及事件委托的初步理解
- C#委托及事件委托的初步理解(经典文章)
- 对C#委托及事件委托的理解
- 对C#委托及事件委托的理解
- 对C#委托及事件委托的理解(转)
- 对C#委托及事件委托的理解
- 对C#委托及事件委托的理解
- 对C#委托及事件委托的理解
- 关于MJRefresh报[NSTaggedPointerString substringToIndex:]的小问题
- docker入门
- java基础--切割字符串
- JAVA通过反射了解集合泛型本质
- MAC 下启动apache,php,mysql
- C# 关于事件 委托的理解
- ARTSPConnection::receive
- jquery的$().each,$.each的区别
- 1 java环境配置记录
- JavaScript 严格模式详解
- poj 1182 食物链
- VS2012更改/重置默认开发环境
- Ncut运行时遇到版本不兼容R = cholinc(C,'1e-6');
- Unsupported major.minor version 52.0