最近一朋友找工作面试遇到这么个题目,正好我也对此有点模糊,遂进行了一番资料查询,找到了这个文章:

http://www.cnblogs.com/chengxingliang/archive/2013/05/21/3051912.html

然而爱动手的我,觉得只看文章是不行的,决定动手一试,发现...文章内容并非全对!

文章中说event不能直接用"="赋值,然而经过我的实验,在某些情况下,这其实是可以的.

以下代码就能运行通过:

public delegate int di(int a);
public static event di e3;
static void Main(string[] argv)
{
e3 = (x) =>
{
Console.WriteLine(x);
return x;
};
Console.WriteLine($"ret={e3(1)}");
Console.ReadKey(true);
}

动手结果令我大为吃惊,居然和文章中说的不同!

后来我将代码改成了这样,才得以论证文章说的结果:

public class MyClass
{
public di d1;
public event di e1;
public static event di e2;
} static void Main(string[] argv)
{
e3 = (x) =>
{
Console.WriteLine(x);
return x;
};
var MC = new MyClass();
MyClass.e2 = (x) =>
{
Console.WriteLine(1);
return 1;
};
MC.e1 = (x) =>
{
Console.WriteLine(1);
return 1;
};
MC.e1 += (x) =>
{
Console.WriteLine(2);
return 2;
}; Console.WriteLine($"ret={MC.e1(1)}");
Console.WriteLine($"ret={MC.d1(1)}");
Console.WriteLine($"ret={e3(1)}");
Console.WriteLine($"ret={MyClass.e2(1)}");
Console.ReadKey(true);
}

可以看到class里的event确实是不能直接用=赋值,而且也不能在class外面直接调用,而delegate可以

后续我还做了相关小实验,实验过程就不描述了,以下列出实验收获:

通过这次动手,我得到了比文章上更详细的知识:

1:event在事件发行者class里面是可以通过"="赋值的.

2:delegate可以在声明它的class外部被调用.

3:delegate也可以用"+="添加多个订阅者(文章中没说不行,但也没直接说行,我起初误会为不行,实验证明可以)

4:如果你调用的委托(event也是委托的一种)有返回值,并且有多个订阅者,那么你收到的返回值是最后一个订阅者返回的(一个疑点:为何不返回array呢...)

.NET 里delegate和event的区别的更多相关文章

  1. delegate和event的区别 (zz)

    一. delegate C#代理实际上类似于C++中的函数指针,因为C#中不存在指针,所以用代理可以完成一些原来在C++中用函数指针完成的操作,例如传递一个类A的方法m给另一个类B的对象,使得类B的对 ...

  2. Delegate成员变量和Event的区别

    上周五有同事问了我一个问题:Delegate和Event有什么区别?具体来说在设计一个类的时候,声明一个事件(Event)和声明一个Delegate类型的成员变量有啥区别.   我的第一反应是没啥区别 ...

  3. delegate和event

    经过查阅资料和自己的理解整理出来的,欢迎大家指教. delegate和event 何时使用: 异步的时候,比如加载完成通知. 需要回调的时候,比如按钮点击.动画播放结束等. 发送事件通知的时候. 比如 ...

  4. [转] C#中的delegate 和 event

    转至:here 终于会用c#中的delegate(委托) 作者:qq826364410 引言 Delegate是Dotnet1.0的时候已经存在的特性了,但由于在实际工作中一直没有机会使用Delega ...

  5. 第一章、C#委托和事件(Delegate、Event、EventHandler、EventArgs)

    第一章.C#委托和事件(Delegate.Event.EventHandler.EventArgs) 分类: 学习笔记-C#网络编程2012-12-08 14:10 7417人阅读 评论(3) 收藏  ...

  6. delegate 和 event

    delegate 和 event 观察者模式 这里面综合了几本书的资料. 需求 有这么个项目: 需求是这样的: 一个气象站, 有三个传感器(温度, 湿度, 气压), 有一个WeatherData对象, ...

  7. 浅谈c#中的delegate和event了

    一.开篇忏悔 对自己最拿手的编程语言C#,我想对你说声对不起,因为我到现在为止才明白c#中的delegate和event是怎么用的,惭愧那.好了,那就趁着阳光明媚的早晨简单来谈谈delegate和ev ...

  8. .NET 中易混淆的概念(Delegate vs Event)

    事件(event)是一个非常重要的概念,我们的程序时刻都在触发和接收着各种事件:鼠标点击事件,键盘事件,以及处理操作系统的各种事件.所谓事件就是 由某个对象发出的消息.比如用户按下了某个按钮,某个文件 ...

  9. 观察者模式与.NET的delegate、event机制

    1.引言 最近在写一些程序玩的时候,接触到了delegate(委托)和event(事件),网上查找了很多的资料,有些博文说可以把delegate近似当做C++当中的函数指针来看,由于自己本身对C++的 ...

随机推荐

  1. C#中如何实现json转化时只处理部分属性

    把对象转化为json字符串,很常用,但如果因为现在大部分项目都是用了ORM映射,导致一个对象的属性特别多,如果前台只需要部分属性如何实现? 当然最简单是所有属性都json化,前台只处理需要的属性,多余 ...

  2. 第1节 常用DOS(磁盘操作系统)命令

    一.打开DOS命令窗口 1)快捷键:win + r,打开命令提示符窗口: 2)左击“开始”菜单,在运行里输入cmd,按回车打开命令提示符窗口: 二.常见命令 1)文件夹操作: d:+ 回车:盘符切换 ...

  3. egg 官方文档之:框架扩展(Application、Context、Request、Response、Helper的访问方式及扩展)

    地址:https://eggjs.org/zh-cn/basics/extend.html Application app 对象指的是 Koa 的全局应用对象,全局只有一个,在应用启动时被创建. 访问 ...

  4. react-router v4.0 知识点

    react-router 提供了一个withRouter组件 withRouter可以包装任何自定义组件,将react-router 的 history,location,match 三个对象传入. ...

  5. ubuntu 客户机安装VMware tools时出现编译错误,无法与主机共享文件(转)

    主机:win7旗舰版 vmware workstation 10.0.7 (其他10.x版本也有这个问题) 客户机:Ubuntu14.04.4-16.x 安装vmware tools时出现下列编译错误 ...

  6. ASP.NET AJAX入门系列(6):UpdateProgress控件简单介绍

    在ASP.NET AJAX Beta2中,UpdateProgress控件已经从“增值”CTP中移到了ASP.NET AJAX核心中.以下两篇关于UpdateProgress的文章基本翻译自ASP.N ...

  7. FFMPEG Qt视频播放器

    本文是根据PaintEvent事件处理函数不停在组件中绘制视频帧数据 做过图像界面开发的都知道,任何耗时的操作都不能放在主线程进行,一旦主线程阻塞了,那么体现出来的就是界面卡了. 而我们读取视频和解码 ...

  8. zabbix 3.4监控mysql,提示mysql: [Warning] Using a password on the command line interface can be insecure.

    mysql从5.6版本开始,如果是命令行直接出现了数据库连接密码就会有以下警告: mysql: [Warning] Using a password on the command line inter ...

  9. msp430及stm32中基本的C编程知识

    为什么我使用P1OUT ^= 0x01;和P1OUT = 0x01 ^是异或计算符号 所以 每次运算都是反转的.而不不加这个运算符就是一直保持1的状态. p1out|=bit6的意思p1out的值如果 ...

  10. Office CVE-2017-8570远程代码执行漏洞复现

    实验环境 操作机:Kali Linux IP:172.16.11.2 目标机:windows7 x64 IP:172.16.12.2 实验目的 掌握漏洞的利用方法 实验工具 Metaspliot:它是 ...