2010-11-17 66 views
1

请告诉我Class1和Class2或Event和Delegate之间的区别是什么? 我在Form1中测试我的班级,并得到相同的结果活动和代表测试

//Class1.cs using System; using System.Collections.Generic;使用System.Linq的 ; using 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.Collections.Generic;使用System.Linq的 ; using 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.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing;使用System.Linq的 ; using 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"); 
    } 
} 
+0

[代表和事件之间有什么区别?](http://stackoverflow.com/questions/29155/what-is-the-difference-between-a-delegate-and-events) – Gishu 2010-11-17 03:59:20

+0

参考之前评论中的问题。简而言之,一个事件只是一个由声明类型控制的代表。声明类型控制何时触发事件(任何人都可以触发代表)。它也可以控制添加到委托和从委托操作中删除,并在那里有额外的代码。 – Gishu 2010-11-17 04:01:25

回答

2

事件是保持指针(多个)功能的一种特殊的系统堆栈样可变。一个事件只能保存一个由委托人定义的特殊类型的函数。 委托是函数的类型 - 它就像函数签名必须看起来的定义一样:该函数必须有2个int参数。这就是委托人对系统的基本意义。当您使用与其描述匹配的函数实例化委托时,委托的实例现在保存该函数的地址。这是否有点清楚或没有...?:)这是我看到它的方式。

所以基本上一个事件持有指向的预定义 void函数的类型(委托类型)。

+0

非常感谢。 – Toshio 2010-11-17 04:05:17

+0

没问题:)但要认识到的重要一点是,几乎电脑中的所有东西都只是数据结构(.NET中的类)!所以事件是一个数据结构,委托是数据结构,整数是一个数据结构(在.Net中是struct实际!)等等。只是有些是预定义的(事件例如通过环境 - .Net在你的情况),有些不是(你的类和委托!)。另外一些例如像事件一样具有来自OS /环境的“原生”支持。有人刚刚在你之前写了事件班,你正在使用它,就像有人最终会使用你的班级:) – 2010-11-17 04:10:19

+0

谢谢你的更多信息。我将继续学习如何编写能够提供更多性能并易于理解事件和委托的代码 – Toshio 2010-11-17 04:41:08