c#事件委托

代码是理解的亲娘   直接开干   
using System;
using System.Collections;
public delegate void AddEventHandler(object sender, EventArgs e);  //声明一个事件委托类型
public class ListWithEvent : ArrayList
{
    public event AddEventHandler Added;    //声明一个事件
    protected virtual void OnChanged(EventArgs e)
    {
        if (Added != null)
            Added(this, e);
    }
    public override int Add(object value)
    {
        int i = base.Add(value);
        OnChanged(EventArgs.Empty);
        return i;
    }
}
class EventMethod
{
    public void ListChanged(object sender, EventArgs e)
    {
        Console.WriteLine("This is called when the event fires.");
    }
}
class Program
{
    public static void Main()
    {
        ListWithEvent List = new ListWithEvent();
        EventMethod test = new EventMethod();
        List.Added += new AddEventHandler(test.ListChanged);
        List.Add("Item 1");
        List.Add("Item 2");
        Console.Read();
    }
}


懂了么?

不管,继续


using System;
class Publisher
{
    public delegate void Publish(); //修饰符  关键字    类型   委托名
    public event Publish OnPublish;   //定义Pubish委托类型事件
    public void issue()     //定义触发事件的方法
    {
        if (OnPublish != null)        //事件不为空
        {
            Console.WriteLine("发行刊物!");
            OnPublish();             //事件发生
        }
    }
}
class Subscriber
{
    public void Receive()
    {
        Console.WriteLine("订阅者已收到刊物!");
    }
}
class Story
{
    static void Main()
    {
        Publisher Pub = new Publisher();
        Subscriber Sub = new Subscriber();
        Pub.OnPublish += new Publisher.Publish(Sub.Receive); //此时往委托的对象->事件里存放一个新的委托对象(即事件);此时该事件不为空,参数是目标对象的方法
        Pub.issue();   //触发事件                                               
        Console.Read();
    }
}



哇哈哈!  没事 

来吧!

using System;
class Publisher    //出版社
{
    public delegate void PubComputer(string magazineName);
    public delegate void PubLife(string magzineName);
    public event PubComputer OnPubComputer;
    public event PubLife OnPubLife;
    public void issueComputer()   //定义触发事件的方法
    {
        if (OnPubComputer != null)       
        {
            Console.WriteLine("发行《电脑》杂志!");
            OnPubComputer("电脑杂志");   //事件发生   利用委托传递参数
        }
    }
    public void issureLife()   //定义触发事件的方法
    {
        if (OnPubLife != null)
        {
            Console.WriteLine("发行《生活》杂志!");
            OnPubLife("生活杂志");   //事件发生
        }
    }
}
class Subscriber      //订阅者
{
    private string name;
    public Subscriber(string name)
    {
        this.name = name;
    }
    public void Receive(string magazineName)
    {
        Console.WriteLine(name + "已经收到" + magazineName);
    }
}
class Story
{
    static void Main()
    {
        Publisher Pub = new Publisher();
        Subscriber zs = new Subscriber("张三");
        Pub.OnPubComputer += new Publisher.PubComputer(zs.Receive); //向事件发行者预定一个事件
        Subscriber ls = new Subscriber("李四");
        Pub.OnPubComputer += new Publisher.PubComputer(ls.Receive);  //触发事件  引发与之关联的方法
        Pub.OnPubLife += new Publisher.PubLife(ls.Receive);//new操作符是创建一个委托的对象
                            //此时往委托的对象->事件里存放一个新的委托对象(即事件),与目标对象方法关联;此时该事件不为空  OnPublife!=null
Pub.issueComputer(); //触发事件 Pub.issureLife(); Console.WriteLine(); Console.WriteLine("一年以后"); Pub.OnPubComputer -= new Publisher.PubComputer(ls.Receive); Pub.issueComputer(); Pub.issureLife(); Console.Read(); }}




现在好点了吧


再来大招!!!

using System;
using System.Collections;
class PubEventArgs : EventArgs
{
    private readonly string m_magazineName;
    private readonly string m_pubDate;
    public PubEventArgs(string magazineName, DateTime PubDate)
    {
        m_magazineName = magazineName;
        //PubDate = new DateTime();
        m_pubDate = PubDate.ToString();
    }
    public string magazineName   //属性
    {
        get
        {
            return m_magazineName;
        }
    }
    public string pubDate    //属性
    {
        get
        {
            return m_pubDate;
        }
    }
}
class Publisher
{
    public delegate void PubComputerEventHandler(object sender, PubEventArgs e);
    public delegate void PubLifeEventHandler(object sender, PubEventArgs e);     
    public event PubComputerEventHandler PubComputer;         
    public event PubLifeEventHandler PubLife;                         
    protected virtual void OnPubComputer(PubEventArgs e)            
    {                                                                  
        PubComputerEventHandler handler = PubComputer; //防止可能出现的线程同步问题  
        if (handler != null)    //当事件绑定对应的方法时,该事件非空                    
        {                                                                          
            handler(this, e);   //this  为触发该事件的类的对象    e 为包含事件参数的类的对象      
        }                                                                                    
    }                                                                                    
    protected virtual void OnPubLife(PubEventArgs e)   
    {
        PubLifeEventHandler handler = PubLife;  //与上同
        if (handler != null)
        {
            handler(this, e);
        }
    }
    public void issueComputer(string magazineName, DateTime pubDate)
    {
        Console.WriteLine("发行" + magazineName);
        OnPubComputer(new PubEventArgs(magazineName, pubDate));
    }
    public void issueLife(string magazineName, DateTime pubDate)
    {
        Console.WriteLine("发行" + magazineName);
        OnPubLife(new PubEventArgs(magazineName, pubDate));
    }
}
class Subscriber
{
    private string name;
    public Subscriber(string name)
    {
        this.name = name;
    }
    public void Receive(object sender, PubEventArgs e)
    {
        Console.WriteLine(e.pubDate + "" + name + "已经收到" + e.magazineName);
    }
}
class Story
{
    static void Main()
    {
        Publisher Pub = new Publisher();
        Subscriber zs = new Subscriber("张三");
        Pub.PubComputer += new Publisher.PubComputerEventHandler(zs.Receive);
        Subscriber ls = new Subscriber("李四");
        Pub.PubComputer += new Publisher.PubComputerEventHandler(ls.Receive);
        Pub.PubLife += new Publisher.PubLifeEventHandler(ls.Receive);
        Pub.issueComputer("电脑杂志", Convert.ToDateTime("2010-9-15"));
        Pub.issueLife("生活杂志", Convert.ToDateTime("2010-9-15"));
        Console.WriteLine();
        Console.WriteLine("一年以后");
        Pub.PubComputer -= new Publisher.PubComputerEventHandler(ls.Receive);
        Pub.issueComputer("电脑杂志", Convert.ToDateTime("2011-9-15"));
        Pub.issueLife("生活杂志", Convert.ToDateTime("2011-9-15"));
        Console.Read();
    }
}



.net Framework 的命名方式  1、事件的命名应使用Pascal Casing 命名方式
   2 声明delegate时,必须使用void类型作为返回值。事件命名方面 例如: eventName事件的事件委托是
EventNameEventHandler,时间接受两个传入参数,一律命名为sender与e。
   3 定义一个提供事件数据的类,对类以EventNameEventArgs 进行命名,从System.EventArgs派生该类,然后添加所有事件特定的成员  
   4 在类中实现时间准则。如果事件不需要传递参数,也要声明两个参数,e
         参数直接使用系统提供的System.EventArgs类。如果传递数据,则要从 System.EventArgs继承一个类,并把数据放在里面。
   5 在引发事件的类中,提供一个受保护的办法。以OnEventName进行命名,在该方法中引发事件。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿的探索之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值