本人是初学菜鸟,有错误的地方欢迎大家指正。
什么是事件:事件可以看出委托的另一种方式,可以理解成某事件发生时的通知方式。事件—>委托-----方法一,方法二,方法三
事件如何定义:
1,定义一个事件发生时关联的委托
2,用这个委托定义一个事件。
public delegate void MoveDelgate(object source,string info);
public event MoveDelgate MoveEven;
事件如何使用:
1,编写触发事件的方法。(事件触发程序)
2,编写触发事件后要实现的方法。(事件处理程序)
3,将事件处理方法加入事件存储器。(事件+=方法名)
4,触发(调用) 事件触发程序。(方法调用)
namespace NewTest
{
public delegate void MoveDelgate(object source,string info);
class Person
{
public event MoveDelgate MoveEven;
public string info = "I'm Person";
public void Touch(object source)//触发事件的方法
{
if (source != null)
{
MoveEven(source,info);
}
}
}
class Touched
{
public void say(object source,string info)//事件处理程序
{
Console.WriteLine(info+"\n"+"触发我的是"+"\n"+source.GetType());
}
}
}
namespace NewTest
{
class Program
{
static void Main(string[] args)
{
Person Zhang = new Person();
Touched T=new Touched();
Zhang.MoveEven += T.say;//将方法加入事件存储器
Zhang.Touch(T);//调用事件触发方法。
}
}
}
输出结果
I'm Person
触发我的是
NewTest.Touched
事件的注意点和规范:
1,事件的修饰符可以是new sealed || public protected internal private 访问修饰符
override abstract static virtual 只能使用这行中的一个,其中用了abstract不能用访问修饰符
(ps:这些除了访问修饰符,其他的修饰符与事件搭配怎么用呢?)
2,一般事件委托的定义为 public delegate void xxxEvenHandle(object source,EventArgs s);其中返回值总是void,source指出触发源,s指其他信息。
3,事件有存取器件。
4,事件的重写,感觉主要好像是重写事件触发方法,重写触发方法时好像必须重写事件(书上好像没有,我自己试了一下,不知道对不对),程序如下:
public delegate void MoveDelgate(object source,string info);
public delegate void MoveEventDelgate(object source);
class Person
{
public virtual event MoveDelgate MoveEven;
public string info = "开始移动";
public virtual void Touch()
{
if (info != null)
{
MoveEven(this,info);
}
}
}
class Touched
{
public void say(object source,string info)
{
Console.WriteLine(info+"\n"+"触发我的是"+"\n"+source.GetType());
}
}
class Student : Person
{
public override event MoveDelgate MoveEven;//重写事件
public override void Touch()//重写触发事件的方法
{
if ( info!= null)
{
Console.WriteLine("重写触发方法");
MoveEven(this,info);
}
}
}
class Program
{
static void Main(string[] args)
{
Person Zhang = new Person();
Touched T=new Touched();
Student My = new Student();
Zhang.MoveEven += T.say;
Zhang.Touch();
Console.WriteLine();
My.MoveEven += T.say;
My.Touch();
}
}
输出结果:
开始移动
触发我的是
NewTest.Person
重写触发方法
开始移动
触发我的是
NewTest.Student