一、委托

把方法作为参数传给其他方法;

二、声明委托

在C#中使用一个类时,分两个阶段。首先,需要去定义一个类,然后实例化类的一个对象(只需要静态方法除外)。 使用委托也需要经过这2个步骤,首先必须定义要使用的委托,对于委托,定义它就是告诉编译器这种类型的委托表示哪种类型的方法。然后,必须创建该委托的一个或多个实例。编译器在后台将创建表示该委托的一个类。定义委托的语法如下:

delegate void IntMethodInvoker(int x);

在这个示例中,定义了一个委托IntMethodInvoker,并指定该委托的每个实例都可以包含一个方法的引用,该方法带有一个int参数,并返回void。理解委托的一个要点就是他们的类型安全性非常高。在定义委托时,必须给出它所表示的方法的签名和返回类型等全部细节;

假设要定义一个委托,该委托表示的方法包含有两个decimal型的参数,返回类型为decimal;

delegate decimal MethodInvoker(decimal x, decimal y);

三、使用委托

首先定义好委托,然后创建该委托的一个或多个实例;假设我要使用上面MethodInvoker的话,代码如下:

MethodInvoker invoker = new MethodInvoker(Math.Max);
decimal x = invoker(5.20m, 5.21m);
Console.WriteLine("x:" + x);

在这里我们把Math.Max(decimal val1,decimal val2) 返回传给了委托;得出2个值中最大一个值,运行上面代码可以得到如下结果:

如果MethodInvoker委托,只是想得到2个参数进行一系列操作后返回一个结果。上面的结构就不能满足这个需求,因为已经限制好了参数类型和返回类型。说到这,对泛型熟悉的朋友就应该知道,如果采用泛型去声明该委托,就可以解决这个问题了。我们就接着上面的代码改造:

delegate T MethodInvoker<T>(T x1, T x2);

MethodInvoker<decimal> invoker = new MethodInvoker<decimal>(Math.Max);
decimal x = invoker(5.20m, 5.21m);
Console.WriteLine("x:" + x);
Console.ReadLine();
MethodInvoker<double> invoker1 = new MethodInvoker<double>(Math.Pow);
double x1 = invoker1(, );
Console.WriteLine("x:" + x1);

输出结果:

参与泛型的方式声明委托后就可以满足输入2个参数进行操作后得到一个返回结果;

四、简单委托示例

定义一个简单的数据操作类MathOperation,添加2个静态方法Add(int,int)、Reduce(int,int),两个方法都返回int类型,代码如下:

    public class MathOperation
{
public int Add(int x, int y)
{
return x + y;
} public int Reduce(int x, int y)
{
return x - y;
}
}

下面调用这些方法:

          delegate int MathOperDelegate(int x, int y);

            MathOperDelegate[] operation = {
MathOperation.Add,
MathOperation.Reduce
}; for (int i = ; i < operation.Length; i++)
{
Console.WriteLine("执行第{0}个委托方法", i);
for (int j = ; j < ; j++)
{
Console.WriteLine("执行结果为:{0}", operation[i](i, j));
Thread.Sleep();
}
}

在这段代码中,实例化了一个MethodDelegate委托的数组,然后遍历这个数组,然后执行其中的不同返回,得到的结果如下:

五、为什么要使用委托

使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的。

C#中的委托(一)的更多相关文章

  1. C# 中的委托和事件

    觉得这篇文章写的非常好,大神之作,由简入繁,对我这种初学者来说帮忙很大,特此留存下. 摘自:http://tracefact.net/CSharp-Programming/Delegates-and- ...

  2. Objective-C中的委托(代理)模式

    我个人更喜欢把委托(Delegate)模式称为代理(Proxy)模式.还是那句话,第一次接触代理模式是在Java中接触的,在Java中实现代理模式和接口是少不了的.当时学习Spring的时候用到了接口 ...

  3. C# 中的委托和事件(转)

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

  4. C# 中的委托和事件(转载)

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

  5. 【转】C# 中的委托和事件

    阅读目录 C# 中的委托和事件 引言 将方法作为方法的参数 将方法绑定到委托 事件的由来 事件和委托的编译代码 委托.事件与Observer设计模式 .Net Framework中的委托与事件 总结 ...

  6. 第3章 C#中的委托和事件

    .NET框架中的委托和事件 using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  7. 分分钟用上C#中的委托和事件之窗体篇

    上次以鸿门宴的例子写了一篇名为<分分钟用上C#中的委托和事件>的博文,旨在帮助C#初学者迈过委托和事件这道坎,能够用最快的速度掌握如何使用它们.如果觉得意犹未尽,或者仍然不知如何在实际应用 ...

  8. 《C#高级编程》学习笔记------C#中的委托和事件(续)

    本文转载自张子阳 目录 为什么要使用事件而不是委托变量? 为什么委托定义的返回值通常都为void? 如何让事件只允许一个客户订阅?(事件访问器) 获得多个返回值与异常处理 委托中订阅者方法超时的处理 ...

  9. c#中的委托和事件(转)

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

  10. C#中的委托和事件(续)

    转自张子阳的博客http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-Advanced.aspx 引言 如果你看过了 C#中 ...

随机推荐

  1. vue项目目录介绍

    Vue项目目录 初始化项目 vue init webpack []projectname] cd [projectname] npm install vue run dev 目录树 +---build ...

  2. http协议的八种请求类型

    GET:向特定的资源发出请求. POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件).数据被包含在请求体中.POST请求可能会导致新的资源的创建和/或已有资源的修改. OPTIONS: ...

  3. 分享一本书<<谁都不敢欺负你>>

    有些人,不管在工作还是生活上,总是被人欺负. 分享这本书给大家,能给大家带来正能量.你强大了,就没人敢欺负你. 有的时候,感到为什么倒霉的总是我?为什么我的命运是这样?为什么总欺负我? 也许有很多人会 ...

  4. 少年,是时候换种更优雅的方式部署你的php代码了

    让我们来回忆下上次你是怎么发布你的代码的: 1. 先把线上的代码用ftp备份下来 2. 上传修改了的文件 3. 测试一下功能是否正常 4. 网站500了,赶紧用备份替换回去 5. 替换错了/替换漏了 ...

  5. jquery中is()函数

    is(expr)函数判断当前Jquery对象所匹配的元素是否存在.只要其中一种符合,就返回 true,否则返回 false. 如果 expr是个字符串,既视为Jquery的选择器,用于表示选择的元素. ...

  6. 【Vue 入门】使用 Vue2 开发一个展示项目列表的应用

    前言 一直没有找到一个合适的展示个人项目的模板,所以自己动手使用 Vue 写了一个.该模板基于 Markdown 文件进行配置,只需要按一定规则编写 Markdown 文件,然后使用一个 在线工具 转 ...

  7. Mysql net start mysql启动,提示发生系统错误 5 拒绝访问,原因所在以及解决办法

    1,Mysql net start mysql启动,提示发生系统错误 5 拒绝访问 在dos下运行net  start MySQL 不能启动mysql!提示发生系统错误 5:拒绝访问!切换到管理员模式 ...

  8. hdu3336 Count the string kmp+dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3336 很容易想到用kmp 这里是next数组的应用 定义dp[i]表示以s[i]结尾的前缀的总数 那么 ...

  9. Java IO详解(一)------File 类

    File 类:文件和目录路径名的抽象表示. 注意:File 类只能操作文件的属性,文件的内容是不能操作的. 1.File 类的字段 我们知道,各个平台之间的路径分隔符是不一样的. ①.对于UNIX平台 ...

  10. 无分类编址(CIDR)构成超网

    CIDR(无分类域间路由选择) CIDR最主要有两个以下特点: 消除传统的A,B,C地址和划分子网的概念,更有效的分配IPv4的地址空间,CIDR使IP地址又回到无分类的两级编码.记法:IP地址::= ...