新人请教委托事件区别

sdghchj 2017-10-01 02:35:48
看到另一个贴子里楼主以下面的代码为例证明自己对事件与委托豁然开朗。
但是,然而,but我真无法理解他是怎么靠这个例子理解清楚事件与委托的。
其实,其实,其实,下面的代码,不要那个event关键字,代码运行逻辑照样正常。
居然单播、多播委托的概念都出来了,实际上并没有任何关键字来区分单播还是多播,所以我理解的所谓委托也本就是一个函数指针容器而已;而事件问题,其实就是个委托,我真不知道多这个event关键字有什么球用!
还请老司机解释一下。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 收衣服
{
public delegate void Mydelegate(); //先定义一个委托类

class me //我
{
public void PickupClothes() //我有一个收衣服的方法
{
Console.WriteLine("衣服收好了!");
}
public void PhoneNeighbor() //我还有一个给邻居打电话的方法
{
Neighbor PLMM = new Neighbor(); //假设邻居是一个漂亮MM~
PLMM.GetPhone += new Mydelegate(PickupClothes); //告诉她怎么收衣服。。。(给getphone事件绑定一个pickupclothes的方法)
PLMM.Doit(); //just do it...
}
}
class Neighbor //邻居
{
public event Mydelegate GetPhone; //邻居有一个接电话的事件
public void Doit() //邻居还要有一个能处理事件的方法
{
if (GetPhone != null) //如果我打电话过来不是啥都没说
{
GetPhone(); //那么就照我说的去做吧!
}
}
}

class Program
{
static void Main(string[] args)
{
Console.WriteLine("下雨了!"); //下雨了。。。
me me = new me(); //实例化一个我
me.PhoneNeighbor(); //给邻居打电话
}
}
}
...全文
413 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdghchj 2017-10-01
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
同样地,.net 中的 Deelgate 表面上起名字i叫做“委托”,而实际编译之后是 MultiDelegate 并不是简单的单播委托。不深入理解就只会知道抠名词儿而搞不懂实际开发中声明的 Delegate 变量为什么能多播调用多个客户委托的知识了。
引用 4 楼 sp1234 的回复:
委托是个复杂对象,你把它理解为“指针”,这就好像是把飞机理解为“一块铁”,你永远是对的,可惜一遇到高级而针对性的设计问题就可能随时怂了。把.net 里边有着严格的运行时约束检验、设计时有着很规范的编程设计的特殊对象,理解为c语言中那种毫无约束的可以胡乱用一个整数覆盖的胡乱的“指针”,你永远“对”,但是停留在c语言的水平无法理解 .net 的进阶概念。
谢谢哈,你应该是个大牛了。其实我就是想问语法上有了event关键字后与原本的delegate有什么区别了,而不是概念上的区别。 语法上并没有关键字去区分delegate是单播还是多播,从这一层面上说单播只是多播的一种情况,编译后的区别那只是编译器对语法糖的实现吧,但也说明理解相对底层一点的东西才能更好理解高阶的东西。怎么说呢,七八年前自学过一次C#语法,看了委托完全不理解在说什么,后来学了C/C++了解函数指针回调函数之类的概念后,才对C#的委托恍然大悟。语言大多是相通的,虽然学多了可能有些地方会有理解分歧,但也能帮助理解其它方面的知识点。如果停留在C语言水平我就不会看C#了,有了C/C++语言水平才能更好了解C#、JAVA之类所谓值类型与引用类型。 飞机与铁的关系只是语法提供的实现层次上的不同砖块而已吧,C/C++有函数指针,C#有高阶点的delegate,C++有更高阶点的std::function<>,C#也有类似的func<>,其它解释类脚本弱类型语言如js之类的函数名就跟普通变量一样随便传递。 说多了,其实我就是想问个语法问题,可能一楼没说清楚。还是谢谢。
  • 打赏
  • 举报
回复
委托是个复杂对象,你把它理解为“指针”,这就好像是把飞机理解为“一块铁”,你永远是对的,可惜一遇到高级而针对性的设计问题就可能随时怂了。把.net 里边有着严格的运行时约束检验、设计时有着很规范的编程设计的特殊对象,理解为c语言中那种毫无约束的可以胡乱用一个整数覆盖的胡乱的“指针”,你永远“对”,但是停留在c语言的水平无法理解 .net 的进阶概念。
sdghchj 2017-10-01
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
这就好像建筑和水泥砖头的区别,你从工程角度去看就能看到真正重要的层次,你从工人搬砖的角度就只能看到好像是随随便便就能“堆砌任何大楼”的底层概念。 实际上我们都知道,工人以为大楼都是堆砌起来的,真因为此所以他们连最矮的小楼堆起来也要崩塌。 event 是编程规范,有了 event 关键字的约束,那么编程者就只用 +=、-= 等极其有限的个别规范写法,不能随便去修改和覆盖委托。理解高层的编成规范,就理解了为什么要用委托之上的 event 而不用底层的无更多规范的委托。
引用 5 楼 ilikeff8 的回复:
eventm可以看成是对委托的封装,是可订阅的事件,只提供对外+=,-=,而不允许=和new进行修改 ,而且还提供可视化功能,设计用于控件的事件属性的可视化绑定
嗯,我只想知道语法上有什么区别进而为什么这样而已,两位都提到过了只能+= -=。
ilikeff8 2017-10-01
  • 打赏
  • 举报
回复
eventm可以看成是对委托的封装,是可订阅的事件,只提供对外+=,-=,而不允许=和new进行修改 ,而且还提供可视化功能,设计用于控件的事件属性的可视化绑定
  • 打赏
  • 举报
回复
同样地,.net 中的 Deelgate 表面上起名字i叫做“委托”,而实际编译之后是 MultiDelegate 并不是简单的单播委托。不深入理解就只会知道抠名词儿而搞不懂实际开发中声明的 Delegate 变量为什么能多播调用多个客户委托的知识了。
  • 打赏
  • 举报
回复
这就好像建筑和水泥砖头的区别,你从工程角度去看就能看到真正重要的层次,你从工人搬砖的角度就只能看到好像是随随便便就能“堆砌任何大楼”的底层概念。 实际上我们都知道,工人以为大楼都是堆砌起来的,真因为此所以他们连最矮的小楼堆起来也要崩塌。 event 是编程规范,有了 event 关键字的约束,那么编程者就只用 +=、-= 等极其有限的个别规范写法,不能随便去修改和覆盖委托。理解高层的编成规范,就理解了为什么要用委托之上的 event 而不用底层的无更多规范的委托。
真相重于对错 2017-10-01
  • 打赏
  • 举报
回复
事件是一种特殊的多播委托,仅可以从声明事件的类或结构(发布服务器类)中对其进行调用。 如果其他类或结构订阅该事件,则在发布服务器类引发该事件时,将调用其事件处理程序方法。 有关详细信息和代码示例,请参阅事件和委托。

111,098

社区成员

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

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

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