События
Событийная модель становится неотъемлемой частью современного программирования. Она применяется повсеместно, но наиболее часто при создании интерфейса пользователя, когда каждое действие пользователя представляется в виде события и передается определенному объекту.
Для объявления события в C# используются делегаты. Когда происходит событие, вызываются все методы делегатов, переданных классу клиентами. Приведем простой пример использования событий:
using System;
public delegate void SampleDelegate();
public class SampleClass{
public event SampleDelegate SampleEvent;
public void onEvent()
{
if (SampleEvent != null)
SampleEvent();
}
}
public class Loader{
private static void eHandler1()
{
Console.WriteLine("Произошло событие: Первый обработчик");
}
private static void eHandler2()
{
Console.WriteLine("Произошло событие: Второй обработчик");
}
static public void Main () {
SampleClass sc = new SampleClass();
sc.SampleEvent += new SampleDelegate(eHandler1);
sc.SampleEvent += new SampleDelegate(eHandler2);
sc.onEvent();
}
} |
С событиями связано несколько особенностей. События могут использоваться только в том классе, в котором они описаны и не могут напрямую использоваться в порожденных классах. События отличаются от переменных-членов тем, что они могут быть помещены в интерфейс. Приведем определения события в интерфейсе:
using System;
public delegate void SampleDelegate();
public interface I {
event SampleDelegate SampleEvent;
void onEvent();
}
public class SampleClass: I
{
public event SampleDelegate SampleEvent;
public void onEvent()
{
if (SampleEvent != null)
SampleEvent();
}
}
public class Loader{
private static void eHandler1() {
Console.WriteLine("Произошло событие: Первый обработчик");
}
private static void eHandler2() {
Console.WriteLine("Произошло событие: Второй обработчик");
}
static public void Main () {
I i = new SampleClass();
i.SampleEvent += new SampleDelegate(eHandler1);
i.SampleEvent += new SampleDelegate(eHandler2);
i.onEvent();
}
} |
Платформа .NET определяет некоторые правила использования событий, и во время написания компонентов, которые будут использоваться совместно с .NET компонентами, их необходимо придерживаться: Делегаты, используемые с событиями должны принимать два агрумента - объект, говорящий о том, кто вызвал событие; и некоторый экземпляр класса, наследованного от класса EventArgs. Для всех событий, которые не используют дополнительную информацию в .NET уже определен соответствующий комбинированный делегат - System.EventHandler.
public delegate void EventHandler(object sender,EventArgs e); |
Приведем пример программы использующей событие нажатия на кнопку:
Команда компиляции:
csc /t:winexe /r:System.DLL;System.WinForms.DLL;Microsoft.Win32.Interop.DLL d.cs
using System;
using System.WinForms;
public class SampleForm : Form
{
private Button button1 = new Button();
public static void Main (String[] args)
{
Application.Run(new SampleForm());
}
public SampleForm()
{
this.Text = "Delegates & Events";
button1.Text = "Event";
button1.Click += new System.EventHandler(buttonClicked);
this.Controls.Add(button1);
}
private void buttonClicked(object sender, EventArgs evArgs)
{
MessageBox.Show("Кнопка была нажата");
}
} |
Лицензионное соглашение
- © 2000-2012 dotSITE
Хостинг .NET предоставлен
PARKING.RU
Поддержку сайта осуществляет Murano Software Inc., Offshore software development