1

Class1とClass2の違い、またはEventとDelegateの違いを教えてください。Form1でクラスをテストしても、同じ結果が得られます

//Class1.cs using System; System.Collections.Genericを使用します。System.Linqを使用します。System.Textを使用します。

class Class1EventArgs
{
    public StringBuilder CallStack;

    public Class1EventArgs() {
        CallStack = new StringBuilder();
    }
}

delegate void Class1EventHandler(Object sender, Class1EventArgs e);

class Class1
{
    public event Class1EventHandler EventDelegate;

    public void EventCaller()
    {
        Class1EventArgs e = new Class1EventArgs();
        e.CallStack.AppendLine("EventCaller");
        OnClass1Event(e);
    }

    protected virtual void OnClass1Event(Class1EventArgs e)
    {
        if (EventDelegate != null)            
        {               
            EventDelegate(this, e);
            System.Windows.Forms.MessageBox.Show(e.CallStack.ToString());
        }
    }

}

//Class2.cs using System; System.Collections.Genericを使用します。System.Linqを使用します。System.Textを使用します。

public class Class2EventArgs
{
    public StringBuilder CallStack = new StringBuilder();
}

public delegate void Class2EventHandler(object sender,Class2EventArgs e);

class Class2
{
    public Class2EventHandler EventDelegate;

    public Class2()
    {
        EventDelegate = new Class2EventHandler(this.OnEventHappen);
    }

    public void EventCaller()
    {
        Class2EventArgs e = new Class2EventArgs();

        e.CallStack.AppendLine("EventCaller");

        EventDelegate.Invoke(this, e);

        System.Windows.Forms.MessageBox.Show(e.CallStack.ToString());
    }

    protected virtual void OnEventHappen(object sender, Class2EventArgs e)
    {
        e.CallStack.AppendLine("OnEventHappen");
    }

}

//Form1.cs using System; System.Collections.Genericを使用します。System.ComponentModelを使用します。System.Dataを使用します。System.Drawingを使用します。System.Linqを使用します。System.Textを使用します。System.Windows.Formsを使用します。

public partial class Form1 : Form
{
    Class1 c1 = new Class1();
    Class2 c2 = new Class2();

    public Form1()
    {
        InitializeComponent();
    }

    #region "Button1"      

    private void button1_Click(object sender, EventArgs e)
    {
        c1.EventCaller();
    }

    private void c1_EvenDelegate(object sender, Class1EventArgs e)
    {
        e.CallStack.AppendLine("c1_EvenDelegate");
    }

    private void c1_EvenDelegate_2(object sender, Class1EventArgs e)
    {
        e.CallStack.AppendLine("c1_EvenDelegate_2");
    }

    #endregion

    private void Form1_Load(object sender, EventArgs e)
    {
        //c1 = new Class1();
        c1.EventDelegate += new Class1EventHandler(c1_EvenDelegate);
        c1.EventDelegate += new Class1EventHandler(c1_EvenDelegate_2);

        c2.EventDelegate += new Class2EventHandler(c2_OnEventHappen1);
        c2.EventDelegate += new Class2EventHandler(c2_OnEventHappen2);
    }

    private void button2_Click(object sender, EventArgs e)
    {
        c2.EventCaller();
    }

    private void c2_OnEventHappen1(object sender, Class2EventArgs e)
    {
        e.CallStack.AppendLine("c2_OnEventHappen1");
    }

    private void c2_OnEventHappen2(object sender, Class2EventArgs e)
    {
        e.CallStack.AppendLine("c2_OnEventHappen2");
    }
}
4

1 に答える 1

2

イベントは、関数へのポインタを保持する特別なシステムスタックのような変数です。イベントは、デリゲートによって定義された特別なタイプの関数のみを保持できます。Delegateは関数の型です。これは、関数のシグネチャがどのように見えるかを定義するようなものです。この関数には2つのintパラメーターが必要です。これは、基本的にデリゲートがシステムに対して意味することです。説明に一致する関数を使用してデリゲートをインスタンス化すると、デリゲートのインスタンスがその関数のアドレスを保持するようになります。これはやや明確ですか、それともまだです...?:)これが私の見方です。

したがって、基本的に、イベントは、事前定義されたvoid型の関数(デリゲート型)へのポインターを保持します。

于 2010-11-17T03:57:21.417 に答える