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并发面试问题之公平锁与非公平锁是啥?【石杉的架构笔记】
随机推荐
- scrapy yield Request
import scrapy from myproject.items import MyItem class MySpider(scrapy.Spider): name = ’example.com’ ...
- (转)嵌入式学习准备---linux c 文件锁
(1)fcntl函数说明 前面的这5个基本函数实现了文件的打开.读写等基本操作,这一节将讨论的是,在文 件已经共享的情况下如何操作,也就是当多个用户共同使用.操作一个文件的情况,这时,Linux 通常 ...
- Eclipse输入任意字母或指定字符出现提示框
Eclipse默认是输入"."的时候会有提示框提示对应的API. 如果想更方便的输入任意字母或者指定的符号出现提示框设置如下: 打开Eclipse,选中“Window”->& ...
- [BigData]关于Hadoop学习笔记第二天(PPT总结)(一)
Plan: 分布式文件系统与HDFS HDFS体系结构与基本概念 HDFS的shell操作 java接口及常用api HADOOP的RPC机制 HDFS源码分析 远程debug 自己设计一分布式文件系 ...
- less-1
说在前面的话,为什么用less: 1.需要编写的代码明显变少了 2.css管理更加容易 3.less学习成本低 4.使用less实现配色变得非常容易 5.兼容css3,实现各个浏览器中css的兼容写法 ...
- 关于System.Collections空间
System.Collections命名空间包含可使用的集合类和相关的接口,提供了集合的基本功能. 该命名空间下的.NET非泛型集合类如下所示: — System.Collections.ArrayL ...
- Linux 命令 - ftp: 网络文件传输工具
命令格式 ftp [-pinegvd] [host] 命令参数 -A 传输文件模式为主动模式. -p 传输文件模式为被动模式. -i 关闭交互模式. -n 关闭自动登录功能. -e 不记录历史命令. ...
- IIS服务器应用程序不可用的解决办法
转载:http://www.cnblogs.com/caicainiao/archive/2010/11/29/1891085.html 这个问题见了好几次,在.net下 Microsoft visu ...
- 每天一道LeetCode--172. Factorial Trailing Zeroes
Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in log ...
- jquery获取文档高度和窗口高度的例子
jquery获取文档高度和窗口高度,$(document).height().$(window).height() $(document).height():整个网页的文档高度 $(window).h ...