如何在有类和接口时调用事件

时间:2012-11-15 13:08:45

标签: c#

此代码由一个接口委托和一个类硬盘组成,代码工作正常但我试图理解代理,类,接口和事件是如何工作的,坦率地说这不是我的代码,但我想从中学习,我的问题严格关于如何调用事件以及程序员在哪里编写或在下面的代码中声明它们,如果我错了请纠正我

虽然我不确定

,但这是一个类sendevent或委托
namespace ConsoleApplication4
{
    delegate void SendEventHandler(object sender, SendEventArgs args);
    class SendEventArgs : EventArgs
    {
        public byte[] Buf;
        public int ByteCount;
        public object whom;
        public SendEventArgs(byte[] Buf, int ByteCount, object whom)
        {
            this.Buf = Buf;
            this.ByteCount = ByteCount;
            this.whom = whom;
        }
    }
}

根据我自己的理解,这是一个接口名称isata

interface ISata
    {
        //voltage +12В, +5В или +3.3В
        Double Voltage { get; }
        //transfer rate (bytes / sec)
        Int64 DataTransferRate { get; }
        event SendEventHandler SendEvent;
        void Send(byte[] Buf, int ByteCount, object whom);
        void OnReceive(object sender, SendEventArgs args);
        void ConnectWith(ISata Device);
        void Disconnect(ISata Device);

这是一个类硬盘

namespace ConsoleApplication4
{
    class HardDisk : ISata
    {
        string Id = "no id";

        public Double Voltage
        {
            get
            {
                return 12;
            }
        }

        public Int64 DataTransferRate
        {
            get
            {
                return 629145600;
            }
        }

        public event SendEventHandler SendEvent;

        public HardDisk(string Id)
        {
            this.Id = Id;
        }

        public override string ToString()
        {
            return "HD{" + Id + "}";
        }

        public void ConnectWith(ISata Device)
        {
            Device.SendEvent += OnReceive;
            this.SendEvent += Device.OnReceive;            
            Console.WriteLine(this + " connected with device " + Device);
        }

        public void Disconnect(ISata ConnDev)
        {
            if (ConnDev != null)
            {
                this.SendEvent -= ConnDev.OnReceive;
                ConnDev.SendEvent -= OnReceive;
                Console.WriteLine(this + " disconnected from device " + ConnDev);                
            }            
        }

        public void Send(byte[] Buf, int ByteCount, object whom)
        {
            if (SendEvent != null)
            {
                SendEvent(this, new SendEventArgs(Buf, ByteCount, whom));
            }
        }

        public void OnReceive(object sender, SendEventArgs args)
        {
            if(args.whom == this)
                Console.WriteLine(this + " received data from " + sender);
        }
    }
}

我的问题是,他在哪里宣布了这些事件以及事件在哪里召唤?

4 个答案:

答案 0 :(得分:1)

在界面中,您可以看到:

event SendEventHandler SendEvent;

这就是声明。它说有一个名为SendEvent的事件,其签名应为SendEventHandler (在主文件中声明:

SendEventHandler(object sender, SendEventArgs args);

使用SendEvent(this, new SendEventArgs(Buf, ByteCount, whom));类中的Harddisk调用该事件。

我认为你应该阅读有关事件的信息。事件只是一个多播委托(MSDN)。

答案 1 :(得分:1)

这是宣布事件的地方:

public event SendEventHandler SendEvent;

这是订阅活动的地方;当事件发生时,将调用Device的{​​{1}}方法:

OnReceive

这是事件取消订阅的地方;它会在事件发生时停止调用方法:

this.SendEvent += Device.OnReceive

这是事件被称为":

的地方
this.SendEvent -= ConnDev.OnReceive

答案 2 :(得分:0)

在HardDisk中,他联手ConnectWith中的事件。他在Send解雇了这个事件。 + =和 - =运算符用于向事件添加事件处理程序。

答案 3 :(得分:0)

很久以前我在网上找到了一本书,它是免费的,非常适合学习。

我建议你看看它,你会发现很多很好的解释,包括事件处理程序/多播代表。

http://www.programmersheaven.com/ebooks/csharp_ebook.pdf