Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Events 事件和委托测试_Events_Delegation - Fatal编程技术网

Events 事件和委托测试

Events 事件和委托测试,events,delegation,Events,Delegation,请告诉我1级和2级之间有什么不同,或者事件和代表之间有什么不同? 我在Form1中测试了我的班级,得到了同样的结果 //类别1.cs 使用制度; 使用System.Collections.Generic; 使用System.Linq; 使用系统文本 class Class1EventArgs { public StringBuilder CallStack; public Class1EventArgs() { CallStack = new StringBui

请告诉我1级和2级之间有什么不同,或者事件和代表之间有什么不同? 我在Form1中测试了我的班级,得到了同样的结果

//类别1.cs 使用制度; 使用System.Collections.Generic; 使用System.Linq; 使用系统文本

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());
        }
    }

}
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");
    }

}
//类别2.cs 使用制度; 使用System.Collections.Generic; 使用System.Linq; 使用系统文本

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());
        }
    }

}
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");
    }

}
//表格1.cs 使用制度; 使用System.Collections.Generic; 使用系统组件模型; 使用系统数据; 使用系统图; 使用System.Linq; 使用系统文本; 使用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参数。这就是委托对系统的基本意义。当您使用与其描述匹配的函数实例化委托时,委托的实例现在保存该函数的地址。这有点清楚吗……?:)这就是我的看法


因此,基本上一个事件包含一个指向预定义的函数类型(委托类型)的指针。

可能重复的引用前面评论中的问题。简而言之,事件只是一个具有由声明类型控制的门的委托。声明类型控制触发事件的时间(任何人都可以触发委托)。它还可以控制“添加到代理”和“从代理中删除”操作,并在其中包含其他代码。没问题:)但要认识到的重要一点是,计算机中的几乎所有内容都是简单的数据结构(在.Net中的类)!所以事件是一个数据结构,委托是一个数据结构,整数是一个数据结构(在.Net中实际上是struct!),等等。只是有些是预定义的(例如,在您的例子中是由.Net环境定义的事件),有些不是(您的类和委托!)。还有一些具有来自操作系统/环境的“本机”支持,例如事件。有人在您之前编写了事件类,您正在使用它,就像有人最终会使用您的类一样:)谢谢您提供更多信息。我将继续学习这方面的知识,以编写代码,从而提高性能并易于理解事件和委托