c#事件的一个问题

货郎大叔 2018-06-21 09:21:32
下面是一个事件:
事件1:
public delegate void MyMultiDelegate(int value);
public event MyMultiDelegate handlers;

事件2:
public delegate void ClientClosed(object sender, EventArgs e);
public event Dele_ClientClosed ClientClosedEvent;

第一个事件的参数是一个Int类型的,我这里想说说第二个事件,是自定义的事件啊。
这里的sender是代表事件源吗?
为什么它又代表事件源呢?
是不是只要是object类型的参数都代表事件源呢?
如果是的话,public delegate void Aaa(object sender)里面的sender也代表事件源吗?
...全文
624 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灰狼 2018-06-25
  • 打赏
  • 举报
回复
引用 27 楼 wanghui0380 的回复:
@小灰狼
你可以看看上面那位,2年的时间,纠结各种规定。他最后一个帖子是
https://bbs.csdn.net/topics/391921764

看看把,这就是他的学习结果。你认为这种效果如何



每看到帖子,我一般只关注帖子和各个回复的内容,通常不看是谁发的帖,看了也记不住
不过,作为一个软件工程师,成年累月地把精力放在某一门编程语言的特性研究上,确实是舍本逐末。一直纠结于编程语言,就算研究得再精,也不会有太大的成就,因为你纠结的编程语言是别人开发的,再牛B也只是跟在人家屁股后面跑。编程语言研究得再透彻,最多是一个牛B的Coder,软件工程师想进一步成长,应该把眼界看远一点!
  • 打赏
  • 举报
回复
我也算是新手吧,sender中文意思是发送者,并不是说object类型的都是事件源,应该说是在某个类里面定义了一个事件,该事件需要自身这个发送的对象,然后它将自身传递了进去,并将参数名称取名sender,让你知道是事件源的意思。
wanghui0380 2018-06-22
  • 打赏
  • 举报
回复
@小灰狼
你可以看看上面那位,2年的时间,纠结各种规定。他最后一个帖子是
https://bbs.csdn.net/topics/391921764

看看把,这就是他的学习结果。你认为这种效果如何
wanghui0380 2018-06-22
  • 打赏
  • 举报
回复
引用 25 楼 hemowolf 的回复:
[quote=引用 1 楼 wanghui0380 的回复:]
不要视图跟规定纠结,规定就是规定。

公司规定不准穿拖鞋上班,你要问什么?为啥不准穿拖鞋?难到穿拖鞋的都是废材


规定是人制订的,是人制订的就一定有它存在的道理,没人会吃饱了撑的去制订一些没有意义的规定让人来遵守。
程序设计语言的语法、规则也是人制订的,它会有那样的规则,也就有它存在的道理,程序设计语言的设计都不会吃饱了撑的制订一些无意义的规则

理解了为什么,对技术人员提高能力多少是有帮助的,作为程序员,你的心态可以是“规定就是规定”,遵守就是了,但你没必要如此打击别人进一步求知的积极性吧![/quote]

因为有大多程序员视图在规定上纠结,而不把真正的研究方向放在他改研究的方向。

比如下面这个人,如果你来看看下面这个位老兄,用了2年时间在各种规定上纠结,然后呢?没有然后了,已经消失了。因为他一旦开始工作了,他就会明白,他那2年根本就是在瞎扯淡,完全白费了2年
https://bbs.csdn.net/users/weikeli19/topics
小灰狼 2018-06-22
  • 打赏
  • 举报
回复
引用 1 楼 wanghui0380 的回复:
不要视图跟规定纠结,规定就是规定。

公司规定不准穿拖鞋上班,你要问什么?为啥不准穿拖鞋?难到穿拖鞋的都是废材


规定是人制订的,是人制订的就一定有它存在的道理,没人会吃饱了撑的去制订一些没有意义的规定让人来遵守。
程序设计语言的语法、规则也是人制订的,它会有那样的规则,也就有它存在的道理,程序设计语言的设计都不会吃饱了撑的制订一些无意义的规则

理解了为什么,对技术人员提高能力多少是有帮助的,作为程序员,你的心态可以是“规定就是规定”,遵守就是了,但你没必要如此打击别人进一步求知的积极性吧!
货郎大叔 2018-06-21
  • 打赏
  • 举报
回复
感谢各位的回答,我也认真仔细看了,哎,我的理解力差,还是没明白。
比如:public delegate void Aaa(object sender),我的大脑思考决定赋予sender为事件源,............................然后,sender就成事件源了?
wanghui0380 2018-06-21
  • 打赏
  • 举报
回复
其实书上已经告诉你了

事件基于委托,是对委托的再封装。

so,委托定义可以不需要sender,而事件定义微软规定有sender,当然还是上面那些话,你把sender写成null也行,只有你保证后面接收者不要sender的信息也能运行就可以
xuzuning 2018-06-21
  • 打赏
  • 举报
回复
sender是代表事件源吗?
是的!
sender 中文释义:发件人
在这里表示这个事件是谁发出的,这不是规定而是双方的约定(因为可以没有,比如 MyMultiDelegate)
C#中的所有类型都继承于(或转换成)Object
因此 都可声明为 object
但也不是随意的变量,而是有所指的特定对象,不然处理方就不知道是谁触发的这个事件了
  • 打赏
  • 举报
回复
我们来一点一点说你的理解偏差: 第一个事件的参数是一个Int类型的,我这里想说说第二个事件,是自定义的事件啊。 到这里为止你的理解都没错。 这里的sender是代表事件源吗? 为什么它又代表事件源呢? 是不是只要是object类型的参数都代表事件源呢? 不是,他就是一个object的入参,例如你的绑定语句:
chanel.Closed += (sender, e) => { if (ClientClosedEvent != null) ClientClosedEvent(sender, e); };
写成
chanel.Closed += (sender, e) => { if (ClientClosedEvent != null) ClientClosedEvent(new object(){"aaaaa"}, e); };
是完全没问题的,你是在绑定的时候赋予了这个入参对象事件源,他是什么是你给予的不是他规定的,你可以给他别的东西,但是这样你后续的逻辑能否继续就不一定了。 最后再看你这段话: 是不是只要是object类型的参数都代表事件源呢? 如果是的话,public delegate void Aaa(object sender)里面的sender也代表事件源吗? 答案是不是,但是如果你想要接受事件源的绑定,就需要给你的委托一个object的入参。你弄反了。
wanghui0380 2018-06-21
  • 打赏
  • 举报
回复
你这么看把,sender就是告知,告知接收者是谁发出的。微软只是这么个规定,他自己也遵守这个规定。

你想造假也没问题,这么说把。他其实就像我们快递上的标签,快递公司规定你得写“发件人地址”,正常情况下我们会写正确地址,但是你非不想写“正确地址”呢?快递公司他管不了

所以,不是什么只要是object就可以,而是你愿不愿意,按照规定填写“正确的发件人地址”而已
货郎大叔 2018-06-21
  • 打赏
  • 举报
回复
说了那么多,不知道像下面这样阐述“规则”是否正确呢?

只要满足第一个参数是object,第二个参数是EventArgs,那第一个参数必定是代表事件源?

正确吗?
我一直没有在教科书上找到"规则"
  • 打赏
  • 举报
回复
比如说开发一个“学生注册”用户控件,定义了一个需要抛出的“需要家长信息”的事件,定义这个事件的事件源应该是这个用户控件。然后用户控件里边有一个TextBox,捕获了录入的学生的身份证号输入(事件)了第18位之后立刻抛出上述事件,那么这个时候如果你编写代码时把这个 TextBox 对象作为这个用户控件对象来提供参数,这就是你作为组件服务提供商出 bug 了。
  • 打赏
  • 举报
回复
引用 6 楼 sr32r345 的回复:
[quote=引用 2 楼 sp1234 的回复:]
贴出来你调用 ClientClosedEvent 的源代码来!

没有落地的东西,只抄别人的,就不能理解“为什么”。其实不是要纠结“为什么、是什么”,而是要搞懂“如何做”。你做了你就懂了,你没有做而只是靠别人给你抄,你就永远不完全信别人会诚信地给你在第一个参数提供“事件源”对象。


chanel.Closed += (sender, e) => { if (ClientClosedEvent != null) ClientClosedEvent(sender, e); };
server.ClientClosedEvent += ClientClosedEvent;
void ClientClosedEvent(object sender, EventArgs e)
{ }
[/quote]

这里,你把 channel.Closed 事件抛给你的事件源当作了你打算抛出的 ClientClosedEvent 事件的事件源对象,那么你就要自己保证诚信,你用这个作为事件源是否合适?
货郎大叔 2018-06-21
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
贴出来你调用 ClientClosedEvent 的源代码来!

没有落地的东西,只抄别人的,就不能理解“为什么”。其实不是要纠结“为什么、是什么”,而是要搞懂“如何做”。你做了你就懂了,你没有做而只是靠别人给你抄,你就永远不完全信别人会诚信地给你在第一个参数提供“事件源”对象。


chanel.Closed += (sender, e) => { if (ClientClosedEvent != null) ClientClosedEvent(sender, e); };
server.ClientClosedEvent += ClientClosedEvent;
void ClientClosedEvent(object sender, EventArgs e)
{ }
  • 打赏
  • 举报
回复
定义接口规则就是一个“合同”,那么服务者守不守诚信,不是靠互相抠字眼来约束的,而是靠行动。比如说提供者随便胡乱用一个对象作为第一个参数来调用你的事件响应代码,你怎么理解这个现象呢?是抠字眼还是用行动来理解?
货郎大叔 2018-06-21
  • 打赏
  • 举报
回复
引用 1 楼 wanghui0380 的回复:
不要视图跟规定纠结,规定就是规定。

公司规定不准穿拖鞋上班,你要问什么?为啥不准穿拖鞋?难到穿拖鞋的都是废材

我不是跟规定较劲,我是:

不知道规则是什么?
能否用1、2句话概括一下规则呢?
  • 打赏
  • 举报
回复
贴出来你调用 ClientClosedEvent 的源代码来!

没有落地的东西,只抄别人的,就不能理解“为什么”。其实不是要纠结“为什么、是什么”,而是要搞懂“如何做”。你做了你就懂了,你没有做而只是靠别人给你抄,你就永远不完全信别人会诚信地给你在第一个参数提供“事件源”对象。
wanghui0380 2018-06-21
  • 打赏
  • 举报
回复
不要视图跟规定纠结,规定就是规定。

公司规定不准穿拖鞋上班,你要问什么?为啥不准穿拖鞋?难到穿拖鞋的都是废材
wanghui0380 2018-06-21
  • 打赏
  • 举报
回复
还来你的理解一下委托和事件的区别。

你的描述里长期把委托说成事件。委托原型怎么定义都可以。而事件原型必须是sender+事件参数
正怒月神 2018-06-21
  • 打赏
  • 举报
回复
引用 18 楼 sr32r345 的回复:
嗯,理解了,自定义事件其实并没有规定sender是事件源,只不过我在下面的代码中传入了事件源:

chanel.Closed += (sender, e) => { if (ClientClosedEvent != null) ClientClosedEvent(sender, e); };


好吧,那现在转变一下问题,Button的Click事件

Public Void button_Click(object sender, EventArgs e)

这里的sender是事件源,这是微软规定的吧?

是的
加载更多回复(5)

110,571

社区成员

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

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

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