概念
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示例的更多相关文章

  1. 委托(C#)

    委托,delegate 关键字用于声明一个引用类型,该引用类型可用于封装命名方法或匿名方法.委托类似于 C++ 中的函数指针:但是,委托是类型安全和可靠的.委托类型声明的格式如下: public de ...

  2. 2015-02-07——js笔记

    示例1: var abc; console.log(abc === undefined);        console.log(abc === null);        console.log(t ...

  3. jquery 未来元素事件示例 on() delegate() live()

    jquery 1.7版后建议使用on() $(document).on("click","#green",function(){$(this).after('& ...

  4. 代理delegate到lamda的演化示例

    using System; namespace ConsoleApp1 { public class Program { private delegate int Add(int a, int b); ...

  5. 关于UIButton嵌入到UIView点击无反应问题的解决方法和delegate的简单用法示例(转载)

    做项目封装UIView的时候碰到的问题,没想到有个哥们儿还写成博客,特此收藏! 问题是这样的,几个界面用到同一个自定义返回按钮,于是就想着把这个按钮单独封装起来,添加一个UIView类,在里面自定义U ...

  6. [UE4]事件处理(Handling Events)和委托(Delegate)代码示例(二)【C++】

    3. 创建带参数的委托 我们可以通过修改委托的签名来使其接受参数 比如我们需要接受一个参数的话,可以在 GameMode 中这样声明: DECLARE_DELEGATE_OneParam(FParam ...

  7. [UE4]事件处理(Handling Events)和委托(Delegate)代码示例(一)

    1. 通过重写虚函数来处理事件 MyTriggerVolume.h 自定义一个Actor类,添加一个 Box 组件作为触发区域,然后通过重写虚函数——NotifyActorBeginOverlap, ...

  8. [C#.NET 拾遗补漏]05:操作符的几个骚操作

    阅读本文大概需要 1.5 分钟. 大家好,这是极客精神[C#.NET 拾遗补漏]专辑的第 5 篇文章,今天要讲的内容是操作符. 操作符的英文是 Operator,在数值计算中习惯性的被叫作运算符,所以 ...

  9. WCF学习之旅—第三个示例之四(三十)

           上接WCF学习之旅—第三个示例之一(二十七)               WCF学习之旅—第三个示例之二(二十八)              WCF学习之旅—第三个示例之三(二十九)   ...

随机推荐

  1. PAT 1039 到底买不买

    https://pintia.cn/problem-sets/994805260223102976/problems/994805283241443328 小红想买些珠子做一串自己喜欢的珠串.卖珠子的 ...

  2. Windows 安装 docker 以及1709的简单使用

    PS C:\> Install-Module -Name DockerMsftProvider -Repository PSGallery -Force PS C:\> Install-P ...

  3. 设计模式之工厂模式(c++)

    问题描述 在面向对象系统设计中经常可以遇到以下的两类问题:1)为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口.这样我们可以通过声明 ...

  4. ultraEdit MAC 破解方法

    安装了个UltraEdit 但是需要验证码,太麻烦了,破解方法: 拷贝附件(command +c )然后在MAC的底下点击访达==>应用程序==>UltraEdit==>右击 显示包 ...

  5. python 判断变量有没有定义

    ? 1 2 'varname' in locals().keys() 'varname' in  dir()

  6. Security Testing Test Scenarios

    1 check for sql injection attacks2 secure pages should use https protocol3 page crash should not rev ...

  7. 洛谷P2397 yyy loves Maths VI (mode)

    P2397 yyy loves Maths VI (mode) 题目背景 自动上次redbag用加法好好的刁难过了yyy同学以后,yyy十分愤怒.他还击给了redbag一题,但是这题他惊讶的发现自己居 ...

  8. 【题解】Hanoi双塔问题

    题目描述 给定A,B,C三根足够长的细柱,在A柱上放有2n个中间有空的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形).现要将这些圆盘移到C柱上, ...

  9. ceph S3客户端操作--s3cmd

    S3 client 访问ceph rgw 安装: yum install s3cmd 验证安装是否成功: $s3cmd --version s3cmd version 1.5.2 #表示安装成功 在c ...

  10. Java原子类实现原理分析

    在谈谈java中的volatile一文中,我们提到过并发包中的原子类可以解决类似num++这样的复合类操作的原子性问题,相比锁机制,使用原子类更精巧轻量,性能开销更小,本章就一起来分析下原子类的实现机 ...