C#星夜拾遗之delegate示例
概念
delegate即委托。如果你使用过C++或者js中的回调函数,你会更容易明白一些。在异步操作中常常使用回调函数,例如在Ajax中,当HttpRequest执行异步请求时,就需要有一个状态改变时的回调函数。回调函数其实是一个方法调用的指针,也称为函数指针。在C#中,当需要把方法作为参数进行传递时,就需要用到delegate。 简单委托示例
定义一个委托,代码如下:
private delegate string GetString();
这个委托用来获取一个字符串。接下来在Main方法中调用:
static void Main(string[] args)
{
int i = 20;
//将i的ToString方法作为参数传递给委托
GetString getString = new GetString(i.ToString);
Console.WriteLine(getString()); //执行委托
}
这是委托最简单的例子了,之所以上这么一个简单的例子,只是为了让大家明白,委托并不是深不可测。 多播委托
所谓多播委托,其实就是可以通过 + 和 += 实现多个方法相加,同样可以通过 - 和 -= 实现方法相减。我们在Windows窗体编程中,为一个按钮添加单击事件,就可以看到这样的代码:
this.button1.Click += new System.EventHandler(this. button1_Click);
通过多播委托我们可以为Click事件添加更多的处理函数,代码如下:
this.button1.Click += new System.EventHandler(this. button1_Click1); 如果想要删除一个方法,可以通过下面的代码实现:
this.button1.Click -= new System.EventHandler(this. button1_Click); 匿名方法
匿名方法是用作委托参数的一个代码块。也就是说可以不对传给委托的方法命名,只需要将委托执行的代码写在一个指定的代码块中即可。下面的代码实现一个匿名方法的委托:
//这个委托定义说明,要执行的方法返回值为void,参数为string类型
private delegate void ShowString(string Text); static void Main(string[] args)
{
string str = "这是一个匿名方法"; ShowString ss = delegate(string Text)
{
Console.WriteLine(Text);
};
WriteString ws = new WriteString();
ss += new ShowString(ws.write);
ss.Invoke(str);
} Lambda表达式
C# 3.0中为匿名方法提供了一个新的语法:Lambda表达式。Lambda可用于委托类类型。想了解更多请参考MSDN中Lambda 表达式(C# 编程指南)
下面是一个Lambda的例子,可以了解一下用法:
//这个委托定义说明,要执行的方法返回值为void,参数为string类型
private delegate void ShowString(string Text1, string Text2); static void Main(string[] args)
{
string str1 = "第一个字符串";
string str2 = "第二个字符串"; // λ运算符 >= 左边列出委托需要的参数,如果为一个参数,可以省略()
ShowString ss = (Text1, Text2) =>
{
// 运算符右侧为 方法或匿名方法,如果方法只有一行时可以省略 {}
Console.WriteLine(Text1 + "\n" + Text2);
}; ss(str1, str2);
} 结束语
最后,还是那句老话,如果希望了解更多,还是多用,多查。实践是走向成功的必由之路。在最后的最后,提供出来本文示例的下载SampleDelegateTest.rar
C#星夜拾遗之delegate示例的更多相关文章
- 委托(C#)
委托,delegate 关键字用于声明一个引用类型,该引用类型可用于封装命名方法或匿名方法.委托类似于 C++ 中的函数指针:但是,委托是类型安全和可靠的.委托类型声明的格式如下: public de ...
- 2015-02-07——js笔记
示例1: var abc; console.log(abc === undefined); console.log(abc === null); console.log(t ...
- jquery 未来元素事件示例 on() delegate() live()
jquery 1.7版后建议使用on() $(document).on("click","#green",function(){$(this).after('& ...
- 代理delegate到lamda的演化示例
using System; namespace ConsoleApp1 { public class Program { private delegate int Add(int a, int b); ...
- 关于UIButton嵌入到UIView点击无反应问题的解决方法和delegate的简单用法示例(转载)
做项目封装UIView的时候碰到的问题,没想到有个哥们儿还写成博客,特此收藏! 问题是这样的,几个界面用到同一个自定义返回按钮,于是就想着把这个按钮单独封装起来,添加一个UIView类,在里面自定义U ...
- [UE4]事件处理(Handling Events)和委托(Delegate)代码示例(二)【C++】
3. 创建带参数的委托 我们可以通过修改委托的签名来使其接受参数 比如我们需要接受一个参数的话,可以在 GameMode 中这样声明: DECLARE_DELEGATE_OneParam(FParam ...
- [UE4]事件处理(Handling Events)和委托(Delegate)代码示例(一)
1. 通过重写虚函数来处理事件 MyTriggerVolume.h 自定义一个Actor类,添加一个 Box 组件作为触发区域,然后通过重写虚函数——NotifyActorBeginOverlap, ...
- [C#.NET 拾遗补漏]05:操作符的几个骚操作
阅读本文大概需要 1.5 分钟. 大家好,这是极客精神[C#.NET 拾遗补漏]专辑的第 5 篇文章,今天要讲的内容是操作符. 操作符的英文是 Operator,在数值计算中习惯性的被叫作运算符,所以 ...
- WCF学习之旅—第三个示例之四(三十)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) WCF学习之旅—第三个示例之三(二十九) ...
随机推荐
- MySQL基础~~增、删、改、简单查
mysql> desc demo; +-----------+------------+------+-----+---------+----------------+ | Field | Ty ...
- PLSQL 使用ODBC 数据源导入来自SQLSERVER的数据
1. 创建ODBC数据源 方法: 打开控制命令 Win10 运行->输入 control 查看方式大图标--选择 管理工具 2. 安装了 64位的plsql 应该也选用 64位的ODBC数据源 ...
- [转帖] Win10 多桌面转换的快捷键
http://down.52pk.com/zhishi/52202.shtml win10系统中用户除了可以切换任务之外,还可以进行多桌面切换,就像是切换了电脑屏幕一样,可能网友们还都不知道win10 ...
- hive web界面管理
老版本使用 访问<Hive Server Address>:9999/hwi 1.首先下载对应版本的src文件,本机使用apache-hive-1.2.2-src.tar.gz 2.解压缩 ...
- spring cloud实战与思考(五) JWT之携带敏感信息
需求: 需要将一些敏感信息保存在JWT中,以便提高业务处理效率. 众所周知JWT协议RFC7519使用Base64Url对Header和Payload的Json字符串进行编解码.A JWT is re ...
- Java DateUtils 的实用
Java DateUtils的实用可以很方便的对日期进行对年,月,日,时,分,秒的相加和相减,能很好的解决日期的运算 可以不用必须调用Oracle等数据库本地函数进行运算,相比之下更为简洁方便. pa ...
- Hopcroft-Carp 算法模板 自用
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #d ...
- 机器学习工作流程第一步:如何用Python做数据准备?
这篇的内容是一系列针对在Python中从零开始运用机器学习能力工作流的辅导第一部分,覆盖了从小组开始的算法编程和其他相关工具.最终会成为一套手工制成的机器语言工作包.这次的内容会首先从数据准备开始. ...
- luogu3707 相关分析 (线段树)
把式子展开以后会发现,可以用线段树维护$x,y,x*y,x^2$分别的区间和 然后操作有区间加和区间修改 这个pushdown的时候,如果改和加的标记同时存在,那一定是先改再加,要不然加的标记已经被清 ...
- cf1063B Labyrinth (bfs)
可以证明,如果我搜索的话,一个点最多只有两个最优状态:向左剩余步数最大时和向右剩余步数最大时 然后判一判,bfs就好了 dfs会T惨... #include<bits/stdc++.h> ...