0

このコードはインターフェイスデリゲートとクラスのハードディスクで構成されており、コードは完全に機能していますが、デリゲート、クラス、インターフェイス、およびイベントがどのように機能するかを理解しようとしていますが、率直に言って、これは私のコードではありませんが、そこから学びたいと思っていますイベントを呼び出す方法と、プログラマーがイベントを記述した場所、または以下のコードでイベントを宣言した場所について厳密に説明しています。間違っている場合は修正してください

よくわかりませんが、これはsendeventまたはdelegateクラスです

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

4 に答える 4

1

インターフェイスでは、次のことを確認できます。

event SendEventHandler SendEvent;

それが宣言です。と呼ばれるイベントがSendEventあり、その署名が必要であると書かれていますSendEventHandler (メインファイルで宣言されています:

SendEventHandler(object sender, SendEventArgs args);

)。

SendEvent(this, new SendEventArgs(Buf, ByteCount, whom));イベントは、Harddiskクラスでを使用して呼び出されます。

イベントを読んでおくべきだと思います。イベントは単なるマルチキャストデリゲートです(MSDN)。

于 2012-11-15T13:17:33.203 に答える
1

ここでイベントが宣言されます。

public event SendEventHandler SendEvent;

これは、イベントがサブスクライブされる場所です。イベントが発生すると、DeviceOnReceiveメソッドが呼び出されます。

this.SendEvent += Device.OnReceive

これは、イベントの購読が解除される場所です。イベントが発生したときにメソッドが呼び出されないようにします。

this.SendEvent -= ConnDev.OnReceive

これは、イベントが「呼び出される」場所です。

if (SendEvent != null)
{
    SendEvent(this, new SendEventArgs(Buf, ByteCount, whom));
}
于 2012-11-15T13:17:58.990 に答える
0

ハードディスクでは、彼はのイベントをフックアップしましたConnectWith。彼はでイベントを解雇しましたSend。+ =および-=演算子は、イベントハンドラーをイベントに追加するために使用されます。

于 2012-11-15T13:16:34.350 に答える
0

ずっと前に、オンラインで本を見つけました。無料で、学習に最適です。

イベント ハンドラー/マルチキャスト デリゲートを含む、多くの適切な説明が見つかるはずです。

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

于 2012-11-15T13:20:39.093 に答える