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#中 ...
随机推荐
- 使用iframe调用指定网页的特定位置(显示目标网页某区域的我想要的内容)
使用iframe调用指定网页的特定位置(显示目标网页某区域的我想要的内容) 有些时候我们并不需要显示iframe标签属性src指定的目标网页的所有内容,往往只需要显示某一特定区域.现有两种实现方法提供 ...
- php 产生不重复的随机数
$arr=array();//创建数组 while(count($arr)<10){ $a = mt_rand(1000,9999);//产生随机数 if(!in_array($a,$arr)) ...
- php与http协议
1.预定义变量$_SERVER $_SERVER 是一个包含了诸如头信息(header).路径(path).以及脚本位置(script locations)等等信息的数组. 可以再后台输出 f ...
- 使用Statement执行sql语句
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java ...
- iOS7——图像资源Images Assets
iOS7初体验(3)——图像资源Images Assets 分类: iOS开发2013-06-18 16:02 17583人阅读 评论(2) 收藏 举报 ios7Images xcassets图像资源 ...
- codevs 1031 质数环
题目描述 Description 一个大小为N(N<=17)的质数环是由1到N共N个自然数组成的一个数环,数环上每两个相邻的数字之和为质数.如下图是一个大小为6的质数环.为了方便描述,规定数环上 ...
- 如何进行fragment中的来回切换?
本文选自StackOverflow(简称:SOF)精选问答汇总系列文章之一,本系列文章将为读者分享国外最优质的精彩问与答,供读者学习和了解国外最新技术,本文为大家讲解如何进行fragment中的来回切 ...
- javascript 要注意的事项
记入一些容易出错的地方 function someClass() { this.name = null; 或 undefined } var obj = new someClass(); consol ...
- JAVA中,数组的操作与排序
自己写了正向反向的冒泡排序,还用了静态和NEW方法实现. import java.util.Arrays; public class HelloJava { public static void ma ...
- LinkedList和ArrayList的区别
LinkedeList和ArrayList都实现了List接口,但是它们的工作原理却不一样.它们之间最主要的区别在于ArrayList是可改变大小的数组,而LinkedList是双向链接串列(doub ...