黑马程序员技术交流社区
标题:
关于委托和事件
[打印本页]
作者:
xiaobai198611
时间:
2011-11-3 10:39
标题:
关于委托和事件
谁给用代码方式讲解下事件和委托机制,web开发中如果不用事件驱动,那委托将会扮演什么样的角色?
作者:
黄威
时间:
2011-11-3 12:15
在C#中事件其实是一个委托类型的变量,可以用EventHandler委托类型声明一个标准的事件,也可以自定义委托,再声明自定义事件。事件和委托是分不开的。如果web开发中不用事件驱动,那服务器如何与用户实现交互?
用事件驱动模型来解决新生报到注册的问题,代码如下:
class Program
{
class Student
{
public string name;
public char sex;
public Student(string name, char sex)
{
this.name = name;
this.sex = sex;
}
}
//新生注册事件参数类
class StudentEventArgs : EventArgs
{
private Student someone;
public StudentEventArgs(Student s)
{
someone = s;
}
public Student student
{
get { return someone; }
}
}
class Grade //班级类,也是事件的发送者
{
private ArrayList list; //声明列表,用来保持本班已报到的学生信息
//声明新生报到的委托类型
public delegate void StudentHandler(Object sender, StudentEventArgs g);
public event StudentHandler onNewStudent; //声明新生注册事件
public Grade()
{
list = new ArrayList();
}
//新生s在班级名单上登记报到
public void Add(Student s)
{
list.Add(s);
}
//注册学校花名册,同时发布事件
public void ProcessRegister()
{
Student s;
for (int i = 0; i < list.Count; i++)
{
s = (Student)list[i];
StudentEventArgs e = new StudentEventArgs(s);
if (onNewStudent != null && s != null)
onNewStudent(this, e); //触发事件,发送学生信息
}
}
}
class School
{
private int students; //声明全校学生人数
private ArrayList list;
public School()
{
students = 0;
list = new ArrayList();
}
//声明索引器
public Student this[int index]
{
get
{
if (index < 0 || index >= list.Count)
return (Student)list[0];
else
return (Student)list[index];
}
}
public int Count //返回全校学生人数
{
get { return students; }
}
//声明事件函数,将学生s注册到学校的花名册上
private void Add_NewStudent(object sender, StudentEventArgs e)
{
if (e.student != null)
{
students++;
list.Add(e.student);
}
}
public void AddStudents(Grade g) //声明一个订阅新生注册事件的方法
{
//绑定事件与事件处理函数
g.onNewStudent += new Grade.StudentHandler(this.Add_NewStudent);
}
}
static void Main(string[] args)
{
Grade g = new Grade();
School school = new School();
Student s = new Student("敌法师", '男');
g.Add(s);
s = new Student("屠夫", '男');
g.Add(s);
s = new Student("秀逗魔法师", '女');
g.Add(s);
school.AddStudents(g);
g.ProcessRegister(); //以班级为单位进行学生注册,注册时发布时间
Console.WriteLine("全校已注册的学生共计{0}人,详细名单如下:", school.Count);
for (int i = 0; i < school.Count; i++)
{
Console.WriteLine("姓名:{0}\t性别:{1}", school[i].name, school[i].sex);
}
}
复制代码
作者:
郑文
时间:
2011-11-3 12:20
事件就是封装了的特殊的委托类型。 因为有了委托才有了事件。具体你看张子阳的博客 已经解释的很清楚,如果你想了解委托内部原理 就看看邹少华老师的关于委托内部原理文章,你看这些最后对C语言 指针很熟悉,否则根本看不懂。解释这个问题需要大量篇幅。。
作者:
李波
时间:
2011-12-4 20:59
本帖最后由 李波 于 2011-12-4 21:00 编辑
资源共享: 委托 事件 监听
很好的帖子:http://topic.csdn.net/u/20110331/15/29b5b7c8-e500-40b2-98db-17ff8b48fb7c.html
作者:
陆亚
时间:
2011-12-6 14:59
都是牛人
作者:
王旭
时间:
2011-12-8 21:46
http://topic.csdn.net/u/20110331/15/29b5b7c8-e500-40b2-98db-17ff8b48fb7c.html详细的很
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2