c#事件
事件(Event),可以说是一个用户的操作,比如用户点击了鼠标,按了键盘……,或者是出现一些系统上的通知,应用程序需要在事件发生的时候对这些事件做响应。
-
事件的发布-订阅模型
事件在类中声明且生成,且通过使用同一个类或其他类当中的委托与件处理程序关联。
其中包含事件的类用于发布事件,称为发布器(publisher)类
其他接受事件的类称为订阅器(subscriber)类 -
声明事件
1.声明事件的委托类型
如:public delegate void LogHandler(string status);
2.基于委托来定义事件
如:public event LogHandler log;
使用Visual Studio新建C#控制台应用程序
添加如下代码:
namespace chapter22_007
{
class EventTest
{
private int number;
//声明一个委托
public delegate void NumHandler();
//基于委托定义事件
public event NumHandler ChangeNum;
protected virtual void OnNumChanged()
{
if (ChangeNum != null)
{
ChangeNum();
}
else
{
Console.WriteLine("事件触发!");
}
}
public EventTest(int n)
{
SetNumber(n);
}
public void SetNumber(int n)
{
if (number != n)
{
number = n;
OnNumChanged();
}
}
static void Main(string[] args)
{
EventTest e = new EventTest(100);
e.SetNumber(200);
e.SetNumber(200);
e.SetNumber(1000);
Console.ReadKey();
}
}
}
编译运行结果如下:
使用Visual Studio新建C#控制台应用程序chapter22_008(摘自W3Cschool,其中代码有少部分修正)
class Boiler
{
private int temp;
private int pressure;
public Boiler(int t, int p)
{
temp = t;
pressure = p;
}
public int getTemp()
{
return temp;
}
public int getPressure()
{
return pressure;
}
}
//事件发布器
class DelegateBoilerEvent
{
//声明一个委托
public delegate void BoilerLogHandler(string status);
//基于委托定义事件
public event BoilerLogHandler BoilerEventLog;
public void LogProcess()
{
string remarks = "O. K";
Boiler b = new Boiler(100, 12);
int t = b.getTemp();
int p = b.getPressure();
if (t > 150 || t < 80 || p < 12 || p > 15)
{
remarks = "Need Maintenance";
}
OnBoilerEventLog("Logging Info:\n");
OnBoilerEventLog("Temparature " + t + "\nPressure: " + p);
OnBoilerEventLog("\nMessage: " + remarks);
}
private void OnBoilerEventLog(string message)
{
if (BoilerEventLog != null)
{
BoilerEventLog(message);
}
}
}
class BoilerInfoLogger
{
FileStream fs;
StreamWriter sw;
public BoilerInfoLogger(string filename)
{
fs = new FileStream(filename, FileMode.Append, FileAccess.Write);
sw = new StreamWriter(fs);
}
public void Logger(string info)
{
sw.WriteLine(info);
}
public void Close()
{
sw.Flush();
sw.Close();
fs.Close();
}
}
//事件订阅器
class RecordBoilerInfo
{
static void Logger(string info)
{
Console.WriteLine(info);
}//end of Logger
static void Main(string[] args)
{
BoilerInfoLogger filelog = new BoilerInfoLogger("..\\..\\boiler.txt");
DelegateBoilerEvent boilerEvent = new DelegateBoilerEvent();
boilerEvent.BoilerEventLog += new
DelegateBoilerEvent.BoilerLogHandler(Logger);
boilerEvent.BoilerEventLog += new
DelegateBoilerEvent.BoilerLogHandler(filelog.Logger);
boilerEvent.LogProcess();
filelog.Close();
Console.ReadKey();
// filelog.Close();这个语句需要放在 Console.ReadKey()之前要不然文件中数据无法写入
}//end of main
}//end of RecordBoilerInf
编译运行结果如下: