概述
delegate void Handler();
class Incrementer
{
public event Handler CoutedADozen;
public void DoCount()
{
for (int i = 1; i < 100; i++)
if (i % 12 == 0 && CoutedADozen != null)
CoutedADozen(); //每增加12个计数触发事件一件。
}
}
class Dozens
{
public int DozensCount { private set; get; }
public Dozens(Incrementer incrementer)
{
DozensCount = 0;
incrementer.CoutedADozen += IncrementDozensCount; //订阅事件。
}
void IncrementDozensCount()
{
DozensCount++;
}
}
class Program
{
static void Main()
{
Incrementer incrementer = new Incrementer();
Dozens dozensCounter = new Dozens(incrementer);
incrementer.DoCount();
Console.WriteLine("Number of dozens={0}",
dozensCounter.DozensCount);
}
}
输出结果为:
Number of dozens = 8
标准事件的用法:
关于标准事件的用法需要注意以下几点:
□ 第一个参数用来保存触发事件的对象的引用。由于object类型的,所以可以匹配任何类型的实例;
□ 第二个参数用来保存状态信息,指明什么类型适用于该应用程序;
□ 返回类型是void。
public delegate void EventHandler(object sender,EventArgs e);
EventHandler委托类型的第二个参数是EventArgs类的对象,它声明在System命名空间中。你可能会想,既然第二个参数用于传递数据,EventArgsl类的对象应该可以保存些类型的数据。但是,很显然,你可能错了。
□ EventArgs设计为不能传递任何数据。它用于不需要传递数据的事件处理程序——通常会被忽略。
□ 如果你希望传递数据,必须声明一个派生自EventArgs的类,使用合适的字段来保存需要传递的数据。
尽管EventArgs类实际上并不传递数据,但它是使用EventHandler委托模式的重要部分。不管参数使用的实际类型是什么,object类和EventArgs总是基类。这样EventArgs就能提供一个对所有事件和事件处理器通用的签名,只允许两个参数,而不是各自不同的签名。
现在对上面的委托进行修改:
delegate void Handler();
class Incrementer
{
public event EventHandler CoutedADozen;
public void DoCount()
{
for (int i = 1; i < 100; i++)
if (i % 12 == 0 && CoutedADozen != null)
CoutedADozen(this, null); //每增加12个计数触发事件一件。
}
}
class Dozens
{
public int DozensCount { private set; get; }
public Dozens(Incrementer incrementer)
{
DozensCount = 0;
incrementer.CoutedADozen += IncrementDozensCount; //订阅事件。
}
void IncrementDozensCount(object source, EventArgs e)
{
DozensCount++;
}
}
class Program
{
static void Main()
{
Incrementer incrementer = new Incrementer();
Dozens dozensCounter = new Dozens(incrementer);
incrementer.DoCount();
Console.WriteLine("Number of dozens = {0}",
dozensCounter.DozensCount);
}
}
通过改变上述事件,变为标准事件。输出结果与上述相同。
通过拓展EventArgs来传递数据。
delegate void Handler();
public class IncrementerEventArgs : EventArgs //自定义派生子EventArgs
{
public int IterationCount { set; get; }
}
class Incrementer
{
public event EventHandler<IncrementerEventArgs> CoutedADozen;
public void DoCount()
{
IncrementerEventArgs args = new IncrementerEventArgs();
for (int i = 1; i < 100; i++)
{
if (i % 12 == 0 && CoutedADozen != null)
{
args.IterationCount = i;
CoutedADozen(this, args);
}
}
}
}
class Dozens
{
public int DozensCount { private set; get; }
public Dozens(Incrementer incrementer)
{
DozensCount = 0;
incrementer.CoutedADozen += IncrementDozensCount; //订阅事件。
}
void IncrementDozensCount(object source, IncrementerEventArgs e)
{
Console.WriteLine("Incremented at iteration: {0} in {1}",
e.IterationCount, source.ToString());
DozensCount++;
}
}
class Program
{
static void Main()
{
Incrementer incrementer = new Incrementer();
Dozens dozensCounter = new Dozens(incrementer);
incrementer.DoCount();
Console.WriteLine("Number of dozens = {0}",
dozensCounter.DozensCount);
Console.Read();
}
}
这段程序产生如下输出,展示了被调用时的迭代和源对象的完全限定类名。
移除事件处理程序
class Pulisher
{
public event EventHandler SimpleEvent;
public void RasieTheEvent()
{
SimpleEvent(this, null);
}
}
class Subscriber
{
public void MethodA(object o, EventArgs e) { Console.WriteLine("AAA"); }
public void MethodB(object o, EventArgs e) { Console.WriteLine("BBB"); }
}
class Program
{
static void Main()
{
Pulisher p = new Pulisher();
Subscriber s = new Subscriber();
p.SimpleEvent += s.MethodA;
p.SimpleEvent += s.MethodB;
p.RasieTheEvent();
Console.WriteLine("rnRemove MethodB");
p.SimpleEvent -= s.MethodB;
p.RasieTheEvent();
}
}
输出的结果为:
最后
以上就是酷炫发箍为你收集整理的C#事件的创建。的全部内容,希望文章能够帮你解决C#事件的创建。所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复