A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xiaobai198611 黑马帝   /  2011-11-3 10:39  /  2259 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

谁给用代码方式讲解下事件和委托机制,web开发中如果不用事件驱动,那委托将会扮演什么样的角色?

5 个回复

倒序浏览
在C#中事件其实是一个委托类型的变量,可以用EventHandler委托类型声明一个标准的事件,也可以自定义委托,再声明自定义事件。事件和委托是分不开的。如果web开发中不用事件驱动,那服务器如何与用户实现交互?
用事件驱动模型来解决新生报到注册的问题,代码如下:
  1.     class Program
  2.     {
  3.         class Student
  4.         {
  5.             public string name;
  6.             public char sex;
  7.             public Student(string name, char sex)
  8.             {
  9.                 this.name = name;
  10.                 this.sex = sex;

  11.             }
  12.         }
  13.         //新生注册事件参数类
  14.         class StudentEventArgs : EventArgs
  15.         {
  16.             private Student someone;
  17.             public StudentEventArgs(Student s)
  18.             {
  19.                 someone = s;
  20.             }
  21.             public Student student
  22.             {
  23.                 get { return someone; }
  24.             }
  25.         }
  26.         class Grade  //班级类,也是事件的发送者
  27.         {
  28.             private ArrayList list;  //声明列表,用来保持本班已报到的学生信息
  29.             //声明新生报到的委托类型
  30.             public delegate void StudentHandler(Object sender, StudentEventArgs g);
  31.             public event StudentHandler onNewStudent;  //声明新生注册事件
  32.             public Grade()
  33.             {
  34.                 list = new ArrayList();
  35.             }
  36.             //新生s在班级名单上登记报到
  37.             public void Add(Student s)
  38.             {
  39.                 list.Add(s);
  40.             }
  41.             //注册学校花名册,同时发布事件
  42.             public void ProcessRegister()
  43.             {
  44.                 Student s;
  45.                 for (int i = 0; i < list.Count; i++)
  46.                 {
  47.                     s = (Student)list[i];
  48.                     StudentEventArgs e = new StudentEventArgs(s);
  49.                     if (onNewStudent != null && s != null)
  50.                         onNewStudent(this, e);  //触发事件,发送学生信息
  51.                 }
  52.             }
  53.         }
  54.         class School
  55.         {
  56.             private int students; //声明全校学生人数
  57.             private ArrayList list;
  58.             public School()
  59.             {
  60.                 students = 0;
  61.                 list = new ArrayList();
  62.             }
  63.             //声明索引器
  64.             public Student this[int index]
  65.             {
  66.                 get
  67.                 {
  68.                     if (index < 0 || index >= list.Count)
  69.                         return (Student)list[0];
  70.                     else
  71.                         return (Student)list[index];
  72.                 }
  73.             }
  74.             public int Count  //返回全校学生人数
  75.             {
  76.                 get { return students; }
  77.             }
  78.             //声明事件函数,将学生s注册到学校的花名册上
  79.             private void Add_NewStudent(object sender, StudentEventArgs e)
  80.             {
  81.                 if (e.student != null)
  82.                 {
  83.                     students++;
  84.                     list.Add(e.student);
  85.                 }
  86.             }
  87.             public void AddStudents(Grade g)  //声明一个订阅新生注册事件的方法
  88.             {
  89.                 //绑定事件与事件处理函数
  90.                 g.onNewStudent += new Grade.StudentHandler(this.Add_NewStudent);
  91.             }
  92.         }
  93.         static void Main(string[] args)
  94.         {
  95.             Grade g = new Grade();
  96.             School school = new School();
  97.             Student s = new Student("敌法师", '男');
  98.             g.Add(s);
  99.             s = new Student("屠夫", '男');
  100.             g.Add(s);
  101.             s = new Student("秀逗魔法师", '女');
  102.             g.Add(s);

  103.             school.AddStudents(g);
  104.             g.ProcessRegister(); //以班级为单位进行学生注册,注册时发布时间

  105.             Console.WriteLine("全校已注册的学生共计{0}人,详细名单如下:", school.Count);
  106.             for (int i = 0; i < school.Count; i++)
  107.             {
  108.                 Console.WriteLine("姓名:{0}\t性别:{1}", school[i].name, school[i].sex);
  109.             }

  110.         }
复制代码
回复 使用道具 举报
事件就是封装了的特殊的委托类型。 因为有了委托才有了事件。具体你看张子阳的博客 已经解释的很清楚,如果你想了解委托内部原理 就看看邹少华老师的关于委托内部原理文章,你看这些最后对C语言 指针很熟悉,否则根本看不懂。解释这个问题需要大量篇幅。。
回复 使用道具 举报
本帖最后由 李波 于 2011-12-4 21:00 编辑

资源共享: 委托 事件 监听
很好的帖子:http://topic.csdn.net/u/20110331/15/29b5b7c8-e500-40b2-98db-17ff8b48fb7c.html
回复 使用道具 举报
都是牛人
回复 使用道具 举报
http://topic.csdn.net/u/20110331/15/29b5b7c8-e500-40b2-98db-17ff8b48fb7c.html详细的很
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马