请告诉我什么的Class1和Class2中或事件和代表之间的不同有什么不同? 测试我类Form1并具有相同的结果

//的Class1.cs 使用系统; 使用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 使用系统; 使用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中 使用系统; 使用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");
    }
}
有帮助吗?

解决方案

事件是一个特殊的系统堆栈样可变保持指针(多个)功能。一个事件可以容纳一个只有特殊类型由委托定义的函数为。 委托是一个函数类型 - 它就像一个什么样的函数签名必须看起来像定义:该功能必须有2个int参数。这是基本的委托方式到系统中。当你实例化一个委托与委托的相匹配的描述的实例的功能目前持有该函数的地址。这是明显的有些还是没有......?:)这是我怎么看它。

因此,基本上一个事件具有指向的预先定义 void类型的函数(委托类型)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top