委托是一种可以指向方法的数据类型,可以声明委托类型变量。

声明委托的方式:delegate返回值类型   委托类型名(参数)

比如delegate void MyDel(int n)

注意这里的除了前面的delegate,剩下部分和声明一个函数一样,但是Mydel不是函数名,而是委托类型名

如何创建委托类型的对象:MyDel sp = new Mydel (SayHello)//SayHello需要和MyDel的参数返回值一样;sp这个委托变量就指向SayHello这个方法。注意不要写成new Mydel (SayHello())因为加上()就是调用方法了

简化的方法:MyDel sp = SayHello;//编译器会给搞成new Mydel (SayHello),反编译看看。注意不要写成MyDel sp = SayHello();

委托的使用:委托变量之间可以互相赋值,就是一个传递指向方法的过程;sp()就是调用指向的方法,如果有参数就传递参数。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace mydelSour

{

public class Program

{

static void Main(string[] args)

{

/*

*

* 委托如何调用方法

* 被调用的方法 返回类型 参数类型 必须要和委托保持一致才可以 如: getNameInt string 参数(string a ,int i)   /delegate string  mydelInt(string na,int a);

* 把调用的方法名当参数传入         mydelInt d2 = new mydelInt(getNameInt)     delegate string  mydelInt(string na,int a);  getNameInt(string a ,int i)

* 然后用用实例化对象参入参数        d2("henry",3);   参数 (string na,int a);

*/

mydel dl = new mydel(getName);

dl();

mydelInt d2 = new mydelInt(getNameInt);

//Console.Write(d2); //对象不写括号的话相当于对象tostring   d2.tostring();

// Console.Write(d2("henry", 3)  ); //带上括号()就指调用方法,带括号和不带括号是不一样的

d2("henry", 3);

object[] objs = { 1, 2, 4, 4, 2, 1, 2, 3 };

//通过这样写,获取最大值的算法已经确定,在传参数的是后指定上比较方法就好了

//用委托后,我们不在为每个获取最大值的方法都去写一种算法

int max = (int)GetMax(objs, CompareInt);//原生的写法为GetMax(objs,new CompareNum(CompareInt));//只不过编译器帮我们进行了处理

Console.WriteLine(max);

Console.ReadKey();

}

public static void getName()

{

Console.WriteLine("委托调用无返回类型方法getname");

}

public static string getNameInt(string a, int i)

{

Console.Write(a + i);

return a;

}

delegate bool CompareNum(object obj1, object obj2);

static bool CompareInt(object obj1, object obj2)

{

int i1 = (int)obj1;

int i2 = (int)obj2;

return i1 > i2;

}

static object GetMax(object[] obj, CompareNum cpn)

{

object max = obj[0];

for (int i = 1; i < obj.Length; i++)

{

if (!cpn(max, obj[i]))

{

max = obj[i];

}

}

return max;

}

}

}

更多技术请关注

第十篇 .NET高级技术之委托的更多相关文章

  1. 第二十篇 .NET高级技术之C#中的线程(二) 线程同步基础

    1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...

  2. 第十九篇 .NET高级技术之C#中的线程(一)

    原文://http://www.cnblogs.com/miniwiki/archive/2010/06/18/1760540.html 文章系参考转载,英文原文网址请参考:http://www.al ...

  3. 第十八篇 .NET高级技术之Linq与EF Code-First Fluent API基础讲解

    1.FluentApi简介 在这里提供了一个fluentapi基础的DEMO然后咱们在进一步的学习,直接上干货. 第一步在数据库创建一个表:person 第二步:新建控制台程序FluentAPI 第三 ...

  4. 第十四篇 .NET高级技术之反射

    两个现实中的例子:1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况.这是如何做到的呢?B超是B型超声波,它可以透过肚皮通过向你体内发射B型超声波,当超声波遇到内脏壁的时 ...

  5. 第十二篇 .NET高级技术之lambda表达式

    最近由于项目需要,刚刚学完了Action委托和Func<T>委托,发现学完了委托就必须学习lambda表达式,委托和Lambda表达式联合起来,才能充分的体现委托的便利.才能使代码更加简介 ...

  6. 第十一篇 .NET高级技术之内置泛型委托

    Func.Action 一.如果不是声明为泛型委托 委托的类型名称不能重载,也就是不能名字相同类型参数不同 二..Net中内置两个泛型委托Func.Action(在“对象浏览器”的mscorlib的S ...

  7. 第十六篇 .NET高级技术之序列化

    .net framework的类库中提供了三个可以用于序列化和反序列化的类,分别为BinaryFormatter.SoapFormatter和XmlSerializer. BinaryFormatte ...

  8. 第十五篇 .NET高级技术之正则表达式

    正则表达式 正则表达式是对字符串进行匹配的语法,像name like '%李%'一样,定义了一些特殊的“元字符”,用来判断一个字符串是否满足某个规则.正则表达式非常深,编译器都是基于正则表达式,掌握基 ...

  9. 第二十一篇 .NET高级技术之使用多线程(三)

    1.  单元模式和Windows Forms 单元模式线程是一个自动线程安全机制, 非常贴近于COM——Microsoft的遗留下的组件对象模型.尽管.NET最大地放弃摆脱了遗留下的模型,但很多时候它 ...

随机推荐

  1. iOS应用崩溃日志分析 iOS应用崩溃日志揭秘

    转自:http://www.raywenderlich.com/zh-hans/30818/ios%E5%BA%94%E7%94%A8%E5%B4%A9%E6%BA%83%E6%97%A5%E5%BF ...

  2. 阿里云serverMySQL无法连接问题解决纪实

    作者:fbysss QQ:溜酒酒吧酒吧吾散 blog:blog.csdn.net/fbysss 声明:本文由fbysss原创,转载请注明出处 背景: 在调试程序的时候,发现数据库訪问相关的环节出现错误 ...

  3. CPU维修技术

    中央处理单元(Central Process Unit)简称CPU,是电脑的核心部件,负责处理和运算电脑内部所有数据.因其在电脑中的地位相当重要,所以一旦发生故障就会造成很严重的后果. [技术66]开 ...

  4. 杭电1596find the safest road(spfa)

    find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  5. 利用easyUI的combobox打造自己主动提示组件

    自己主动提示是时下一个非常流行的功能,比方说百度.谷歌的搜索输入框都使用到了这么一个功能. 因为easyUI的combobox设计师已经考虑到了这个功能.所以仅仅需简单几步我们能够轻松打造自己的自己主 ...

  6. Vs2012在Linux开发中的应用(6):改写Makefile项目的Build过程

    MSBUILD的编译过程实际上是依据一系列的targets文件定义的.当我们在IDE运行生成.批生成.清理命令的时候.VS会查找这些命令相应的Task并运行它,以下我们逐个分析这个过程. 当运行生成操 ...

  7. 20170218 OO-ALV标准工具栏按钮

    原文地址:OO ALV 工具栏对于的功能码   图标与对应的 功能码 明细 &DETAIL 检查 &CHECK 刷新 &REFRESH 剪切 &LOCAL&CU ...

  8. 20170218-取值Domain

    1.通过视图DD07V, 例子:取SD 凭证类别的DOMAIN(VBTYP)DATA: LT_DD07V TYPE TABLE OF DD07V.SELECT * INTO T_DD07V FROM ...

  9. boogo08---中间件

    package main //中间件1:只允许特定host请求过来 import ( "fmt" "net/http" ) //SingleHost是一个中间件 ...

  10. JVM Safepoint 安全点

    一.什么是安全点: 在可达性分析算法中查找存活的对象,首先要找到哪些是GC Roots: 有两种查找GC Roots的方法: 一种是遍历方法区和栈区来查找(保守式GC): 一种是通过OopMap的数据 ...