[C#] delegate/event 的详细使用方法介绍与例程

本文介绍了C#中Delegate和Event的基本概念与用法,并通过三个实例详细展示了如何创建及使用Delegate与Event,包括基本使用、利用Hashtable封装Event以及解决接口中同名Event的问题。

一,delegate/event用法的相关介绍

    按照msdn的说法,event就是让你可以指定一个当event发生时发生的委托。当您的代码指示事件发生时,委托可以由有一个或多个相关的方法将被调用。


二,创建delegate/event的步骤

     1,声明一个委托 delegate。

     2,创建一个类,这个类包含:

      a,用声明的委托定义一个event

      b,一个触发事件event的函数

     3,定义一个或者多个类来绑定方法和event(使用+=,-=来处理函数和event)

     4,使用event


三,举例说明delegate/event的使用方法

例一:声明一个接口和类,并且使用event。至于接口和类的含义,请各位自行学习。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace Delegate_Event_Usage1
{
    public delegate void MyDelegate();   // delegate declaration


    public interface I
    {
        event MyDelegate MyEvent;
        void FireAway();
    }


    public class MyClass : I
    {
        public event MyDelegate MyEvent;


        public void FireAway()
        {
            MyEvent?.Invoke();
        }
    }


    class Program
    {
        static private void f()
        {
            Console.WriteLine("This is called when the event fires.");
        }
        static void Main(string[] args)
        {
            I i = new MyClass();
            i.MyEvent += new MyDelegate(f);
            i.FireAway();
        }
    }
}

运行结果:



例二:这个例子讲述了如何利用hashtable来封装event,至于为什么这么做,请大家自行学习hashtable的优点

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;


namespace Delegate_Event_Usage2
{
    public delegate void MyDelegate1(int i);
    public delegate void MyDelegate2(string s);
    public delegate void MyDelegate3(int i, object o);
    public delegate void MyDelegate4();
    public class PropertyEventsSample
    {
        public Hashtable eventTable = new Hashtable();


        public event MyDelegate1 Event1
        {
            add
            {
                eventTable["Event1"] = (MyDelegate1)eventTable["Event1"] + value;
            }
            remove
            {
                eventTable["Event1"] = (MyDelegate1)eventTable["Event1"] - value;
            }
        }


        public event MyDelegate1 Event2
        {
            add
            {
                eventTable["Event2"] = (MyDelegate1)eventTable["Event2"] + value;
            }
            remove
            {
                eventTable["Event2"] = (MyDelegate1)eventTable["Event2"] - value;
            }
        }


        public event MyDelegate2 Event3
        {
            add
            {
                eventTable["Event3"] = (MyDelegate2)eventTable["Event3"] + value;
            }
            remove
            {
                eventTable["Event3"] = (MyDelegate2)eventTable["Event3"] - value;
            }
        }


        public event MyDelegate3 Event4
        {
            add
            {
                eventTable["Event4"] = (MyDelegate3)eventTable["Event4"] + value;
            }
            remove
            {
                eventTable["Event4"] = (MyDelegate3)eventTable["Event4"] - value;
            }
        }


        public event MyDelegate3 Event5
        {
            add
            {
                eventTable["Event5"] = (MyDelegate3)eventTable["Event5"] + value;
            }
            remove
            {
                eventTable["Event5"] = (MyDelegate3)eventTable["Event5"] - value;
            }
        }


        public event MyDelegate4 Event6
        {
            add
            {
                eventTable["Event6"] = (MyDelegate4)eventTable["Event6"] + value;
            }
            remove
            {
                eventTable["Event6"] = (MyDelegate4)eventTable["Event6"] - value;
            }
        }
    }


    class Program
    {
        static private void f()
        {
            Console.WriteLine("This is called when the event fires.");
        }
        static void Main(string[] args)
        {


            PropertyEventsSample sample = new PropertyEventsSample();
            sample.Event6 += f;
            foreach (DictionaryEntry eve in sample.eventTable)
            {
                if (eve.Key.ToString() == "Event6")
                {
                     var method=eve.Value as MyDelegate4;
                     method?.Invoke();
                }
            }
        }
    }
}

运行结果:



例三:当出现两个接口都具有同样的相同名称的event,那么在基类中该如何定义event

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace Delegate_Event_Usage3
{
    class Program
    {
        public delegate void MyDelegate1();


        public interface I1
        {
            event MyDelegate1 MyEvent;
        }


        public delegate int MyDelegate2(string s);


        public interface I2
        {
            event MyDelegate2 MyEvent;
        }


        public class ExplicitEventsSample : I1, I2
        {
            public event MyDelegate1 MyEvent;  // normal implementation of I1.MyEvent.


            event MyDelegate2 I2.MyEvent   // explicit implementation of I2.MyEvent
            {
                add
                {
                    MyEvent2Storage += value;
                }
                remove
                {
                    MyEvent2Storage -= value;
                }
            }


            private MyDelegate2 MyEvent2Storage;  // underlying storage for I2.MyEvent.


            public void FireEvents()
            {
                MyEvent?.Invoke();
                MyEvent2Storage?.Invoke("hello");
            }
        }
        static private void f()
        {
            Console.WriteLine("This is called when the event fires.");
        }
        static private int fStr(string str)
        {
            Console.WriteLine(str);
            return -1;
        }
        static void Main(string[] args)
        {
            ExplicitEventsSample sample = new ExplicitEventsSample();
            sample.MyEvent += f;
            sample.FireEvents();
            
    }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值