第十篇 .NET高级技术之委托
委托是一种可以指向方法的数据类型,可以声明委托类型变量。
声明委托的方式: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高级技术之委托的更多相关文章
- 第二十篇 .NET高级技术之C#中的线程(二) 线程同步基础
1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具: 简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...
- 第十九篇 .NET高级技术之C#中的线程(一)
原文://http://www.cnblogs.com/miniwiki/archive/2010/06/18/1760540.html 文章系参考转载,英文原文网址请参考:http://www.al ...
- 第十八篇 .NET高级技术之Linq与EF Code-First Fluent API基础讲解
1.FluentApi简介 在这里提供了一个fluentapi基础的DEMO然后咱们在进一步的学习,直接上干货. 第一步在数据库创建一个表:person 第二步:新建控制台程序FluentAPI 第三 ...
- 第十四篇 .NET高级技术之反射
两个现实中的例子:1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况.这是如何做到的呢?B超是B型超声波,它可以透过肚皮通过向你体内发射B型超声波,当超声波遇到内脏壁的时 ...
- 第十二篇 .NET高级技术之lambda表达式
最近由于项目需要,刚刚学完了Action委托和Func<T>委托,发现学完了委托就必须学习lambda表达式,委托和Lambda表达式联合起来,才能充分的体现委托的便利.才能使代码更加简介 ...
- 第十一篇 .NET高级技术之内置泛型委托
Func.Action 一.如果不是声明为泛型委托 委托的类型名称不能重载,也就是不能名字相同类型参数不同 二..Net中内置两个泛型委托Func.Action(在“对象浏览器”的mscorlib的S ...
- 第十六篇 .NET高级技术之序列化
.net framework的类库中提供了三个可以用于序列化和反序列化的类,分别为BinaryFormatter.SoapFormatter和XmlSerializer. BinaryFormatte ...
- 第十五篇 .NET高级技术之正则表达式
正则表达式 正则表达式是对字符串进行匹配的语法,像name like '%李%'一样,定义了一些特殊的“元字符”,用来判断一个字符串是否满足某个规则.正则表达式非常深,编译器都是基于正则表达式,掌握基 ...
- 第二十一篇 .NET高级技术之使用多线程(三)
1. 单元模式和Windows Forms 单元模式线程是一个自动线程安全机制, 非常贴近于COM——Microsoft的遗留下的组件对象模型.尽管.NET最大地放弃摆脱了遗留下的模型,但很多时候它 ...
随机推荐
- 走入asp.net mvc不归路:[6]linq常见用法
asp.net mvc结合linq,先不说性能问题,对于增删查改的操作还是相当方便的.以下我们就来介绍一下linq在asp.net mvc的Controller中的常见用法. 1 首先来看看整个数据表 ...
- HDU 1040 As Easy As A+B [补]
今天去老校区找她,不想带电脑了,所以没时间A题了 /*******************************************************************/ As Ea ...
- CSDN-markdown编辑器之从线上导入Markdown文件
CSDN-markdown编辑器支持从线上导入Markdown文件的功能,假设你用其他支持Markdown的编辑器在网上写了博客文章或说明档,想公布到CSDN博客中,就能够使用本功能非常方便的完毕 ...
- startActivity、 startActivityForResult 、广播的使用
前言 近期忙着跟项目.好久没有写文字了.今天一个群里面的童鞋问到一个关于不同界面间传值的问题,借这个背景,写一段关于" startActivity. startActivityForResu ...
- iGrimaceVX3.0和1.44在线源手机直接安装教程
[第一步] 先安装好三个组件设备必须是苹果越狱好后 确定6点几跟7点几的版本号才干够 首先打开cydia 选开发人员 以下 点软件源 点右上角编辑 1加入源 apt.25pp.com和IG包下载源a ...
- exists用在linq上
SQL里面,有时候会用到exists或者not exists. select * from yb t1 where not exists(select 1 from yb t2 where trunc ...
- poj 1015 Jury Compromise(背包+方案输出)
\(Jury Compromise\) \(solution:\) 这道题很有意思,它的状态设得很...奇怪.但是它的数据范围实在是太暴露了.虽然当时还是想了好久好久,出题人设了几个限制(首先要两个的 ...
- td 中连续数字或连续英文内容不自动换行
原因: 把连续的英文当做成了一个单词. 解决: 加上 : word-break: break-all (允许单词内换行)
- HDU3709 Balanced Number —— 数位DP
题目链接:https://vjudge.net/problem/HDU-3709 Balanced Number Time Limit: 10000/5000 MS (Java/Others) ...
- android 一个TextView设置多种颜色
时候一个文本框为了强调内容需要显示不同颜色,用以下代码可以轻松实现 方法一:(适用于颜色变化多的情况) //为文本框设置多种颜色 textView=(TextView)findViewById(R ...