.NET 里delegate和event的区别
最近一朋友找工作面试遇到这么个题目,正好我也对此有点模糊,遂进行了一番资料查询,找到了这个文章:
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的区别的更多相关文章
- delegate和event的区别 (zz)
一. delegate C#代理实际上类似于C++中的函数指针,因为C#中不存在指针,所以用代理可以完成一些原来在C++中用函数指针完成的操作,例如传递一个类A的方法m给另一个类B的对象,使得类B的对 ...
- Delegate成员变量和Event的区别
上周五有同事问了我一个问题:Delegate和Event有什么区别?具体来说在设计一个类的时候,声明一个事件(Event)和声明一个Delegate类型的成员变量有啥区别. 我的第一反应是没啥区别 ...
- delegate和event
经过查阅资料和自己的理解整理出来的,欢迎大家指教. delegate和event 何时使用: 异步的时候,比如加载完成通知. 需要回调的时候,比如按钮点击.动画播放结束等. 发送事件通知的时候. 比如 ...
- [转] C#中的delegate 和 event
转至:here 终于会用c#中的delegate(委托) 作者:qq826364410 引言 Delegate是Dotnet1.0的时候已经存在的特性了,但由于在实际工作中一直没有机会使用Delega ...
- 第一章、C#委托和事件(Delegate、Event、EventHandler、EventArgs)
第一章.C#委托和事件(Delegate.Event.EventHandler.EventArgs) 分类: 学习笔记-C#网络编程2012-12-08 14:10 7417人阅读 评论(3) 收藏 ...
- delegate 和 event
delegate 和 event 观察者模式 这里面综合了几本书的资料. 需求 有这么个项目: 需求是这样的: 一个气象站, 有三个传感器(温度, 湿度, 气压), 有一个WeatherData对象, ...
- 浅谈c#中的delegate和event了
一.开篇忏悔 对自己最拿手的编程语言C#,我想对你说声对不起,因为我到现在为止才明白c#中的delegate和event是怎么用的,惭愧那.好了,那就趁着阳光明媚的早晨简单来谈谈delegate和ev ...
- .NET 中易混淆的概念(Delegate vs Event)
事件(event)是一个非常重要的概念,我们的程序时刻都在触发和接收着各种事件:鼠标点击事件,键盘事件,以及处理操作系统的各种事件.所谓事件就是 由某个对象发出的消息.比如用户按下了某个按钮,某个文件 ...
- 观察者模式与.NET的delegate、event机制
1.引言 最近在写一些程序玩的时候,接触到了delegate(委托)和event(事件),网上查找了很多的资料,有些博文说可以把delegate近似当做C++当中的函数指针来看,由于自己本身对C++的 ...
随机推荐
- Android开发之GridView的使用(解读谷歌官方API)
GridView将图片显示在二维可移动的网格里.使用ListAdapter能够将Grid项目自己主动填充满整个布局. 以下我们依据官方文档的样例来实现一下使用GridView,点击视图里的 ...
- 谈谈 SOA
为什么要 讨论 SOA 呢 ? 请参考我写的另一篇文章 <论 微服务 和 Entity Framework 对 数据 的 割裂> https://www.cnblogs.com/KS ...
- [转]MyBatis中resultType与resultMap区别
MyBatis中关于resultType和resultMap的具体区别如下: MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap.resu ...
- oracle之 AWR固定基线
前言:可以创建AWR基线来为数据库建立已保存的工作负载视图,以便以后用来与其他AWR快照进行比较. 1. 手工创建 AWR 固定基线(固定基线如果没有设置过期时间,会永久保存) -- 根据时间创建DB ...
- prop-types:该第三方库对组件的props中的变量进行类型检测
利用prop-types第三方库对组件的props中的变量进行类型检测
- 搭建Cordova + Ionic + WebStorm环境开发Web App应用
1. 下载并且安装Node.js(https://nodejs.org/en/) 2. 打开终端,安装cordova (如果安装失败或者卡住不动则重新安装) sudo npm install - ...
- JS和AS交互
这个话题在网上应该说很好找,有很多这方面的资料.比者也看过一些,不过大部分都是AS2与JS进行交互.很少提到AS3,即使有,也让人感觉浅尝辄止.很多东西并没有介绍的太清楚.所有笔者萌生了写这样一篇教程 ...
- pytest学习笔记
From: https://blog.csdn.net/gaowg11/article/details/54910974 由于对测试框架了解比较少,所以最近看了下pytest测试框架,对学习心得做个记 ...
- Android 引用库项目,Debug 库项目
转自:http://www.cnblogs.com/xitang/p/3615768.html#commentform 使用引用项目,无法追到源代码,无法Debug库项目The JAR of this ...
- Android开发之选项菜单(optinosMenu)
android一共有三种形式的菜单: 1.选项菜单(optinosMenu) 2.上下文菜单(ContextMenu) ...