关于C#的事件!

wumylove1234 2004-07-30 10:30:12
初学C#,看的是<C#入门经典>第一版.
看到事件那章,理解非常困难.然后我又看了<C#高级编程>第二版.也是没有理解.
入门经典那本书,说什么订阅一类的,而高级编程那本书讲事件发生器和客户程序.我都理解不了.
哪位大侠能够把你们的理解告诉我一下,用简单的,直白的语言!
面向对象的理解就差这章了.还有,委托的概念和用法我也理解了!
谢谢各位了!
...全文
183 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
wumylove1234 2004-08-01
  • 打赏
  • 举报
回复
啊?原来是这样.我记住了.谢谢各位.结帖了~
sjhcsharp 2004-07-31
  • 打赏
  • 举报
回复
虽然我也是二明白二明白的,但我还是想建议你,反复的考察,SDK上的关于事件的那个,闹钟的例子,然后自己在搞一搞,另外一点要注意的是,事件有,与状态数据的有关的(依耐型)和完全自由的(不依耐型)二种,我这里,给 个小小的提醒,这个要自己去推敲,反正System.EventArgs这个类代表不需要状态信息,
还请大家指正,因为我只是二懂,二懂的,:).
Edison621 2004-07-31
  • 打赏
  • 举报
回复
re
这些概念性的东西想要表述清楚真的不容易:)
winxieddd 2004-07-31
  • 打赏
  • 举报
回复
using System;

namespace ConsoleApplication3
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//

Class2 cla = new Class2();
cla.Event += new ConsoleApplication3.Class2.EventHandler(cla_Event);//向链表中添加一个结点。也就是你要执行的那个方法的名字。

cla.OnEvent("abc");//激活事件,触发方法。

cla.Event -=new ConsoleApplication3.Class2.EventHandler(cla_Event);//从链表中删除一个结点。
}


private static void cla_Event(string str)
{
Console.WriteLine(str);
Console.ReadLine();

}
}

class Class2
{
public delegate void EventHandler(string str); //定义委托

public event EventHandler Event; //用委托定义事件,也就是说,这个事件要激活的方法的参数就只有一个string

public void OnEvent(string str) //事件激活方法。
{
if (Event != null)//如果还没有注册任何要触发的方法,那不执行。这句还意味着可以注册多个要触发的方法。其执行顺序是要从最后注册的那个方法开始,向上执行。
{
Event(str);//把str传给要执行的那个方法,当然,方法名无须知道。其实在内存中就是一个链表的形式。
}
}
}
}


这是一个例子,你先看一下,不太规范,你要你能理解就行了。慢慢来,最后给你推荐一本书:《.net框架程序设计(修正版)》。
ericlin 2004-07-31
  • 打赏
  • 举报
回复
rockey说的很明白
junewhistle 2004-07-31
  • 打赏
  • 举报
回复
《C#入门经典》这本可以,算简单的
《.net框架程序设计(修正版)》看了会晕的,我既是。
rockeymen 2004-07-31
  • 打赏
  • 举报
回复
C#中的事件是由代理实现的,两者没有本质区别
就是说,每一个事件都是一个代理,我们把想让某个事件执行的函数填入到这个事件的代理中,当程序运行这个事件的代理时 ,就相当于运行了我们的函数。

比如鼠标按键,编写按键事件的程序员是不知道我们想在这里调用什么函数的,所以他就在这里留了一个代理,我们想运性什么函数,就把什么函数填入到这个代理中。然后就会被调用了,当然,不是什么函数都可以,填入的函数的参数列表格式必须与代理的参数列表一样,
rockeymen 2004-07-31
  • 打赏
  • 举报
回复
我也是最近才明白委托和事件的含义的。
不妨说说我的理解,
这个我觉得得从起源说起才能明白的

第一,委托:
所谓的委托,就是为了达成这种目的:在我需要的地方,调用别人想让我用的一个函数,为什么不直接调用呢?因为我编写程序的时候,不知道别人写的函数的名字,所以只能在这里留下一个“更高一层的函数”,让别人把他的函数作为参数传进来。
举个实例,在一个叫做thief的类里面,有一个void steal()的函数,还有一个
delegate void act() 的代理,代表警察得行动,生成一个实例是 public act acting;
steal函数中调用了acting这个代理,这个代理作了什么事情呢?作为thief类是不知道的,因为这与填入这个代理中的函数有关
public void steal()
{
acting();
}

比如现在有两个函数hit() catch()
如果在主程序中加入
tf.acting = new test.delegateevent.thief.act (hit);//tf 为thief的实例
那么当运行tf.steal()时 acting()就代表了hit 这个函数,如果主程序中加入
tf.acting = new test.delegateevent.thief.act (catch);
acting就代表了catch这个函数
winxieddd 2004-07-31
  • 打赏
  • 举报
回复
这是我大概的理解的思路,具体实现上,+=我最开始还以为是运算符重载,现在看来是多点委托,对了,我理解的多点委托就是可以在注册事件的组件中,对那个事件进行多点委托,那样应该是顺序的执行委托的顺序.
-----------------------------------------------------------------

这点不对,执行的顺序是从下到上执行的,也就是说,你最后加的哪个。就先执行哪个!
trendvb 2004-07-31
  • 打赏
  • 举报
回复
同楼主一样,看到委托还可以,看到事件,就晕了。
wumylove1234 2004-07-31
  • 打赏
  • 举报
回复
回复人: winxieddd(一剑飘香) ( ) 信誉:100 2004-07-31 03:08:00 得分: 0


《C#入门经典》这本可以。其他的没看过,不做评价。

我说的那本书的中文电子版好象没有。


大哥你太神了,3点多你还在线!!!!!!!!!
wumylove1234 2004-07-31
  • 打赏
  • 举报
回复
有大侠帮我纠正一下我的理解之后就结帖,今晚可以看Winform了!:)
wumylove1234 2004-07-31
  • 打赏
  • 举报
回复
不知道怎么回事,我对大家形象的比喻好像过敏,不能理解形象的比喻,还不如直接给例子看,呵呵.
我现在明白了,而且自已也写了一个简单的例子.
其实我是从Vb转过来的,以前用VB6写控件什么的,都有事件这个东西的,但是VB6真是害人哦,只是知道应该那样写,但是细节却不知道.我也看了VB.Net中的一个控件的例子,也有事件.我在VB中的理解是:
1,在组件中声明事件
2,在需要的地方触发这个事件
3,在用户界面编写这个事件的处理程序.
嘿嘿,我以为C#不是这样的呢,不过我现在理解了之后其实都是这个原理:
C#的:
1,在组件中声明一个委托,这个委托必需是Void.
2,声明事件,即声明一个委托变量(暂且叫变量吧,几本书叫都都不一样)
3,也和VB一样,在需要触发这个事件的地方声明这个事件,包括参数,这个参数可以自已定吧,不光是sender和EventArgs(或派生类),不过我看书上的意思,一般对System.EventArgs派生就够用了.
4,在需要编写这个事件的组件中,注册这个事件,那么也就是说,在这个注册这个事件的组件中,如果运行时发现包含定义事件的组件中触发了事件,那么就执行这个事件处理程序.
这是我大概的理解的思路,具体实现上,+=我最开始还以为是运算符重载,现在看来是多点委托,对了,我理解的多点委托就是可以在注册事件的组件中,对那个事件进行多点委托,那样应该是顺序的执行委托的顺序.

大侠看看我的理解对不对.可能用词上有些不准确,呵,我英文不好,看不了E文书,看了三本书上关于事件的讲解,三本书上用词都不相同,有一本把delegate译成了代理.不过我想了一下,这个"代理"的说法,我更容易理解一些.到是委托让我晕糊了一阵!:P
winxieddd 2004-07-31
  • 打赏
  • 举报
回复
《C#入门经典》这本可以。其他的没看过,不做评价。

我说的那本书的中文电子版好象没有。
wumylove1234 2004-07-31
  • 打赏
  • 举报
回复
啊.我给你发消息没想到你这么晚还在,还给我回了帖子.不过看不懂.
我搜到了很多关于这个的问题的帖子,看来不是光我自已对这个晕.
呵呵.

你推荐的书有电子版的吗?我这在小城市,不太方便买这样的书,我去了几个大书店都没买到合适的书,邮购好慢.要半个月.没等书到,我人就要走了.呵.

有电子的我就看下吧.我有好几本C#的电子书了!

《C#入门经典》 C# Primer Plus中文版 C#高级编程 (第2版)中文版 C#完全手册
C#专业项目实例开发 Microsoft.NET编程语言c#-BearRui Windows 应用高级编程 - C#编程篇

我看的入门经典!这几个哪个更好呢?
huangsuipeng 2004-07-30
  • 打赏
  • 举报
回复
先休息一下噢
wumylove1234 2004-07-30
  • 打赏
  • 举报
回复
谢谢二位.
希望明天我能理解吧.我今天实在是受不了了.
看了一天的委托和事件.晕糊糊的.
学C#几天,语法和面象对象我都理解了.基本也会用了.就是到了事件这里,好像和C++,VB都不一样.我以前主要用VB,C++理解了一下面向对象.
眼睛好疼啊~~~~受不了了!
shanzai2003 2004-07-30
  • 打赏
  • 举报
回复
C#群:3015115
cnming 2004-07-30
  • 打赏
  • 举报
回复
有点难解释

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧