C# 关于事件 委托的理解

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 = 0
Subscriber sub = new Subscriber();
p.MyEvent ++ sub.Dosomething1;//注册回调方法
p.MyEvent += sub.Dosomethin2;
p.StartEvnet(5); //调用方法,间接触发事件
p.MyEvent -= sub.Dosomething;//取消注册
}
}
}

难点分析:
1,在发布者类中实例化委托事件,并定义一个实例方法,用来调用委托事件 ,先定义一个用来存储事件数据的类
2,定义订阅者类,在该类中定义和委托事件相匹配的方法(事件触发时,实际要执行的方法)
3,在客户端代码中,在发布者类的实例上为委托事件注册回调方法

***
事件对象就是一个委托对象,把事件看作委托,就好理解了,Event 这个单词很忽悠人。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值