C#中的委托是什么?
概述
委托类似C++中的函数指针,但是又有所不同。在C++中,函数指针不是类型安全的,它指向的是内存中的某一个位置,我们无法判断这个指针实际指向什么,对于参数和返回类型就更难以知晓。而.NET的委托则完全不同,它是类型安全的类,我们可以清晰的知道委托定义的返回类型和参数类型。它不仅可以包含方法的引用,还可以包含多个方法的引用。这就是委托,.寻址方法的.NET版本。
理解委托
在实际的开发过程中,有时某个方法执行的操作并不是针对数据进行的,而是针对另一个方法,但是这个方法在编译时又无法得知,只能在运行时才知道。如果是针对数据做操作,只需将数据作为方法的参数传入即可,那么针对方法做操作,很明显将方法作为参数传入即可,听起来的确很奇怪,但是需要先接受这个现实,然后从使用中去体会它的含义。下面举一个例子(请原谅我的英语 ,my english is poor!),这样一个场景:媒婆给菇凉或者小伙介绍对象,如果是对象是男的,菇凉就说出她的联系方式,如果是女的,小伙就说出他的联系方式(PS:我们这里都是正常的性取向)。
看一下代码图
在命名空间里,定义一个委托,和类是平级的
public delegate string GetTelphone(); //用来得到联系方式的。
概述中提到,委托可以定义返回类型和参数类型,那么这个委托的返回类型就是string,无参的。
继续。。。。
媒婆类:
/// <summary>
/// 媒婆
/// </summary>
class MeiPo
{
public string Sex { get; set; }
public void GetTel(GetTelphone getTelphone)
{
Console.WriteLine(getTelphone.Invoke());
}
}
可以看到,GetTel方法的参数是一个委托类型的,和一般的基本类型和常见引用类型引用方式一样使用。然后再方法体执行委托方法,输出结果。
菇凉类:
/// <summary>
/// 菇凉
/// </summary>
class Girl
{
public string GetGirlTel()
{
return "得到菇凉的电话";
}
}
小伙类:
/// <summary>
/// 男屌丝
/// </summary>
class DiaoSi
{
public string GetBoyTel()
{
return "得到男屌丝的电话";
}
}
最后上测试类
static void Main(string[] args)
{
var redMun = new MeiPo {Sex = "男"};
var del= new GetTelphone(new Girl().GetGirlTel);
if(redMun.Sex=="女")
del = new GetTelphone(new DiaoSi().GetBoyTel);
redMun.GetTel(del); Console.ReadKey();
}
执行步骤:
1、创建媒婆对象,媒婆介绍一个sex="男",
2、创建委托对象,委托是一个类,所以用new来实例化。委托即指方法的引用,所在初始化时传入指向的方法引用new Girl().GetGrilTel
3、如果媒婆介绍的是sex="女",那么委托指向另一个方法
4、媒婆对象调用GetTel得到联系方式
总结:委托内容比较复杂,鉴于笔者水平有限,理解有限,这里先解释这么多,以后如果理解更深后,继续分享。
C#中的委托是什么?的更多相关文章
- C# 中的委托和事件
觉得这篇文章写的非常好,大神之作,由简入繁,对我这种初学者来说帮忙很大,特此留存下. 摘自:http://tracefact.net/CSharp-Programming/Delegates-and- ...
- Objective-C中的委托(代理)模式
我个人更喜欢把委托(Delegate)模式称为代理(Proxy)模式.还是那句话,第一次接触代理模式是在Java中接触的,在Java中实现代理模式和接口是少不了的.当时学习Spring的时候用到了接口 ...
- C# 中的委托和事件(转)
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
- C# 中的委托和事件(转载)
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
- 【转】C# 中的委托和事件
阅读目录 C# 中的委托和事件 引言 将方法作为方法的参数 将方法绑定到委托 事件的由来 事件和委托的编译代码 委托.事件与Observer设计模式 .Net Framework中的委托与事件 总结 ...
- 第3章 C#中的委托和事件
.NET框架中的委托和事件 using System; using System.Collections.Generic; using System.Linq; using System.Text; ...
- 分分钟用上C#中的委托和事件之窗体篇
上次以鸿门宴的例子写了一篇名为<分分钟用上C#中的委托和事件>的博文,旨在帮助C#初学者迈过委托和事件这道坎,能够用最快的速度掌握如何使用它们.如果觉得意犹未尽,或者仍然不知如何在实际应用 ...
- 《C#高级编程》学习笔记------C#中的委托和事件(续)
本文转载自张子阳 目录 为什么要使用事件而不是委托变量? 为什么委托定义的返回值通常都为void? 如何让事件只允许一个客户订阅?(事件访问器) 获得多个返回值与异常处理 委托中订阅者方法超时的处理 ...
- c#中的委托和事件(转)
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
- C#中的委托和事件(续)
转自张子阳的博客http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-Advanced.aspx 引言 如果你看过了 C#中 ...
随机推荐
- basename usage in linux
作用:去掉文件的目录和后缀 1.去掉文件路径 jenkins@work:~/ci/script$ basename /backup/jenkins/ci/script/Release.sh.bak R ...
- jQuery extend方法介绍
jQuery为开发插件提拱了两个方法,分别是: jQuery.fn.extend(object); jQuery.extend(object); jQuery.extend(object);为扩展jQ ...
- pm2 安装使用
pm2 是全新开发的进程守护服务, 同时集成了负载均衡功能. 以及开机启动, 自动重启有问题进程. 还可以查看各服务进程状态. 使用方法参照:https://github.com/Unitech/pm ...
- rownum的使用
Oracle 提供了rownum,rownum是一个隐含的字段,默认从1开始. 取得前5条记录: 采用rownum进行分页查询: 需要使用三层嵌套查询来完成分页查询: 例如查询第三到第四条记录: se ...
- Javascript OrderBy
要在js 实现orderBy基本知识就是 array.sortarray.sort(function(a,b){ a 表示 row 0 b 表示 row 1 它会loop多次你可以比较 if(a &g ...
- ural 1104 Don’t Ask Woman about Her Age
http://acm.timus.ru/problem.aspx?space=1&num=1104 #include <cstdio> #include <cstring&g ...
- Linux下快速静态编译Qt以及Qt动态/静态版本共存
Qt下静态编译Qt,根据我的经验,如果按照Windows下那种直接拿官方sdk安装之后的文件来编译是行不通的,需要直接下载Qt的source包,目前诺基亚的源码叫做qt-everywhere-open ...
- 8.2.1.5 Engine Condition Pushdown Optimization 引擎条件下推优化
8.2.1.5 Engine Condition Pushdown Optimization 引擎条件下推优化 这种优化改善了直接比较在一个非索引列和一个常量比较的效率. 在这种情况下, 条件是 下推 ...
- 关于百度地图InfoWindow响应自定义布局点击事件
大概讲解: 在百度地图上显示一个marker,当marker被点击后,显示自定义的View.当自定义的View被点击后,响应不同Button的点击事件.被百度这个infowindo里面的view坑惨了 ...
- Android 查看是否有存储卡插入
String status=Environment.getExternalStorageState(); 2 3 if ( status.equals ( Enviroment.MEDIA_MOU ...