Events 事件和委托测试
请告诉我1级和2级之间有什么不同,或者事件和代表之间有什么不同? 我在Form1中测试了我的班级,得到了同样的结果 //类别1.cs 使用制度; 使用System.Collections.Generic; 使用System.Linq; 使用系统文本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
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环境定义的事件),有些不是(您的类和委托!)。还有一些具有来自操作系统/环境的“本机”支持,例如事件。有人在您之前编写了事件类,您正在使用它,就像有人最终会使用您的类一样:)谢谢您提供更多信息。我将继续学习这方面的知识,以编写代码,从而提高性能并易于理解事件和委托