C# 白话系列之——白话委托
今天看到首页有个委托的文章,但大都写的太专业,而且没有实用的例子场景。正好昨天做了一个有关委托的功能,所以也来凑个热闹,用白话掰掰
一、委托是什么
我们都知道数据类型,简单点的如,想给一个变量赋值整数,那就要定义一个 int类型的变量
int var=;
想给一个变量赋值字符串那就定义一个string类型的变量
string var ="test";
复杂点的就是自己定义一个类,然后就可以定义类变量
MyClass myClass= new MyClass();
现在我们有如下一个方法,怎样把这个方法可以赋值给一个变量呢?
public string GetMessage(string messageType)
{
string ret = ""; switch (messageType)
{
case "error":
ret = "错误消息";
break;
case "warning":
ret = "警告消息";
break;
default:
ret = "未知消息";
break;
}
return ret;
}
这个就要委托来登场了。先看实现
delegate string MessageDelegate(string messageType);
public void Test()
{
MessageDelegate myMessage = GetMessage; string ret = myMessage("error");
}
定义一个类大家都会 ,用 class 关键字来定义一个类MyClass
class MyClass
{
}
同理,用 delegate 关键字来定义一个委托 MessageDelegate。
一定要有这个一个概念,我们用 delegate 关键字定义的委托(MessageDelegate)是一个数据类型。
int 类型的变量用来赋值整数的,string类型的变量用来赋值字符串的,而委托类型的变量是用来赋值函数的。
当然因为每个函数的参数不同,返回的数据不同,所以在定义委托的时候也就指明了这个委托类型的变量可接受的函数。
delegate string MessageDelegate(string messageType);
如上面定义的MessageDeletegate委托数据类型,用MessageDeletegate定义的变量(myMessage)只能接受 有一个string类型的参数并且有一个sting返回值的函数(GetMessage)
MessageDelegate myMessage = GetMessage;
delegate void MyDelete(int i);
上面定义的这个MyDelete委托类型对应的函数是有一个int类型的参数,并且没有返回值。
二、委托的使用
在.net中委托基本随处可见,最常用的就是Action、Func和Predicate,它们分别有很多重载,自己可以看看。
public delegate void Action();
public delegate TResult Func<out TResult>();
public delegate bool Predicate<in T>(T obj);
现在有这么一个功能:
现在有一个int类型的集合,把所有的偶数乘以2,输出到一个新集合中。
测试数据:
List<int> myList = new List<int>();
for (int i = ; i < ; i++)
{
myList.Add(i);
}
普通方法实现:
List<int> retList = new List<int>();
for (int i = ; i < myList.Count; i++)
{
if (myList[i] % == )
{
retList.Add(myList[i] * );
}
}
用委托方法实现:
List<int> retList = new List<int>();
myList.ForEach((data) =>
{
if (data % == )
{
retList.Add(data * );
}
});
当然这个ForEach是.net提供的扩展方法,再加上lambda表达式实现。
这个还不足以说明委托的好处。
如果我们再把问题放宽点,现在有一个int类型的集合,如果里面的数字满足某个条件,则执行某个动作。
public void MyOperation(List<int> myList, Func<int, bool> func, Action<int> action)
{
for (int i = ; i < myList.Count; i++)
{
if (func(myList[i]))
{
action(myList[i]);
}
}
}
现在在把第一个问题实现下:
MyOperation(myList, (d) =>
{
return d % == ;
}, (d) =>
{
retList.Add(d * );
});
可以近一步写成扩展方法,这个有跑题有点远了。
上面这个例子主要是说明了一点:
委托是一个函数类型的数据类型(对比int是一个整数类型的数据类型),可以把委托当做参数变量来传递。
然而因为委托变量的值是函数,这样就可以把一个函数当做参数传递到另外一个函数中。
如上面提到的:
写一个对集合操作的函数,如果集合里面的某个元素满足某个条件,则执行某个动作。
C# 白话系列之——白话委托的更多相关文章
- 《C# 白话系列之——白话委托》读后记
今天在博客圆首页看到一篇文章:<C# 白话系列之——白话委托> http://www.cnblogs.com/djangochina/p/3410002.html#commentform ...
- [转]大白话系列之C#委托与事件讲解(三)
本文转自:http://www.cnblogs.com/wudiwushen/archive/2010/04/21/1717378.html [我希望大家在看完文章的时候,多做做练习,自己也可以想个场 ...
- JavaScript进阶系列06,事件委托
在"JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数"中已经有了一个跨浏览器的事件处理机制.现在需要使用这个 ...
- 委托、Lambda表达式、事件系列05,Action委托与闭包
来看使用Action委托的一个实例: static void Main(string[] args) { int i = 0; Action a = () => i++; a(); a(); C ...
- 委托、Lambda表达式、事件系列03,从委托到Lamda表达式
在"委托.Lambda表达式.事件系列02,什么时候该用委托"一文中,使用委托让代码简洁了不少. namespace ConsoleApplication2 { internal ...
- 大白话系列之C#委托与事件讲解大结局
声明:本系列非原创,因为太精彩才转载,如有侵权请通知删除,原文:http://www.cnblogs.com/wudiwushen/archive/2010/04/20/1698795.html 今天 ...
- 白话系列之实现自己简单的mvc式webapi框架
前言:此文为极简mvc式的api框架,只当做入门api的解析方式,并且这里也不算是mvc框架,因为没有view层,毕竟现在大部分都属于前后端分离,当然也可以提供view层,因为只是将view当做文本返 ...
- 并发系列5-大白话聊聊Java并发面试问题之微服务注册中心的读写锁优化【石杉的架构笔记】
- 并发系列4-大白话聊聊Java并发面试问题之公平锁与非公平锁是啥?【石杉的架构笔记】
随机推荐
- android开发之路09(浅谈SQLite数据库01)
1.SQLite数据库: SQLite 是一个开源的嵌入式关系数据库,实现自包容.零配置.支持事务的SQL数据库引擎. 其特点是高度便携.使 用方便.结构紧凑.高效.可靠. 与其他数据库管理系统不同, ...
- WordPress搬家全攻略
零.前言 我自己有两个博客,一个是你看到的这个,专门用来写我的技术文章:另一个是我自己的心情记录博客,专门记录和技术无关的东西. 之前我的心情记录博客一直放在openshift上面,这是redhat官 ...
- ArcGIS Server 10.2 实战(三)图层标注及图例中文显示乱码的解决
发布的图层中不可避免的使用到中文来标注,默认设置下,ArcGIS Server不支持中文的,中文标注显示成乱码,主要是编码的问题,需要把手动把编码改为UTF-8. ArcGIS Server 10.2 ...
- Objective-C ,ios,iphone开发基础:几个常用类-NSString
第一个字符串: //必须在字符串的前面加上@符号, NSString* str=@"shouqiang_Wei";//输出以%@输出. NSLog(@"%@", ...
- 【暴力,STL,水】UVa 1523 - Helicopter
Since ancient time, people have been dreaming of flying in the sky. Eventually, the dream was realiz ...
- 用java调用oracle存储过程总结(转)
//1.call+包名+存储过程名(传入.传出值用?) String str="{call SMSBUSINESS.deleteZhZMember(?,?,?)}"; //2.建立 ...
- Javascript之换肤(未完待续)
这个项目我还没有完全写出来,先记录至此.感觉是方法不对,背景图片的切换方法有Problem.如若有一大神发现了我的文章,还望指导,吾将感激不尽.日后代码还会再钻研再改改. <head> & ...
- Java之趣味编程结婚问题
问题如下:判断结婚的组合对数数.定义: 好三位新郎为 A,B,C ;三位新娘为X,Y,Z 有人想要知道他们谁和谁结婚 ,于是问了其中的三位. 回答是这样的:A说他将和X结婚 :X说她的未婚夫是C ;C ...
- <转载>提升程序的特权(AdjustTokenPrivileges)
首先列出需要的函数 1.OpenProcessToken 2.AdjustTokenPrivileges 3. LookupPrivilegeValue ----------------------- ...
- android控件的属性
android控件的属性 本节描述android空间的位置,内容等相关属性及属性的含义 第一类:属性值为true或false android:layout_centerHrizontal 水平居中 ( ...