2010-11-17 3 views
1

Скажите, пожалуйста, что отличает Class1 и Class2 от разных событий и делегатов? Я тестирую свой класс в 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 с использованием системы; с использованием 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"); 
    } 
} 
+0

Возможный дубликат [В чем разница между делегатом и событиями?] (Http://stackoverflow.com/questions/29155/what-is-the-difference-between-a-delegate-and-events) – Gishu

+0

См. Вопрос в предыдущем комментарии. Короче говоря, событие - это просто делегат с затвором, управляемым типом объявления. Тип объявления управляет при запуске события (делегаты могут быть уволены кем-либо). Он также может управлять добавлением делегирования и удалением из операций делегирования и иметь дополнительный код. – Gishu

ответ

2

Событие представляет собой специальную системную стекобразную переменную, которая содержит указатели (указатели) к функциям. Событие может содержать только специальный тип функций, определяемый делегатом. Делегат - это тип функции - это похоже на определение того, как должна выглядеть сигнатура функции: эта функция должна иметь 2 параметра int. Это то, что в основном означает для делегата. Когда вы создаете экземпляр делегата с функцией, которая соответствует его описанию, то экземпляр делегата теперь содержит адрес этой функции. Является ли это явным или пока еще ...? :) Вот как я это вижу.

Таким образом, в основном событие содержит указатель на предопределенный тип функции void (тип делегата).

+0

большое спасибо. – Toshio

+0

Нет проблем :) Но важно понять, что почти все в компьютерах - это просто структура данных (классы в .Net)! Таким образом, событие представляет собой структуру данных, делегат - это структура данных, целое - это структура данных (в .Net - структура на самом деле!) И так далее. Просто, что некоторые из них предопределены (например, события в среде -.Net в вашем случае), а некоторые нет (ваши классы и делегат!). А у некоторых есть «родная» поддержка от ОС/среды, например, таких как события. Кто-то просто написал класс событий перед вами, и вы используете его точно так же, как кто-то будет использовать ваши классы в конце концов :) –

+0

Благодарим вас за дополнительную информацию. я пойду об этом, чтобы написать код, который дает больше производительности и легко понять о событии и делегировать – Toshio

Смежные вопросы