今天看到首页有个委托的文章,但大都写的太专业,而且没有实用的例子场景。正好昨天做了一个有关委托的功能,所以也来凑个热闹,用白话掰掰

一、委托是什么

我们都知道数据类型,简单点的如,想给一个变量赋值整数,那就要定义一个 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# 白话系列之——白话委托的更多相关文章

  1. 《C# 白话系列之——白话委托》读后记

    今天在博客圆首页看到一篇文章:<C# 白话系列之——白话委托> http://www.cnblogs.com/djangochina/p/3410002.html#commentform ...

  2. [转]大白话系列之C#委托与事件讲解(三)

    本文转自:http://www.cnblogs.com/wudiwushen/archive/2010/04/21/1717378.html [我希望大家在看完文章的时候,多做做练习,自己也可以想个场 ...

  3. JavaScript进阶系列06,事件委托

    在"JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数"中已经有了一个跨浏览器的事件处理机制.现在需要使用这个 ...

  4. 委托、Lambda表达式、事件系列05,Action委托与闭包

    来看使用Action委托的一个实例: static void Main(string[] args) { int i = 0; Action a = () => i++; a(); a(); C ...

  5. 委托、Lambda表达式、事件系列03,从委托到Lamda表达式

    在"委托.Lambda表达式.事件系列02,什么时候该用委托"一文中,使用委托让代码简洁了不少. namespace ConsoleApplication2 { internal ...

  6. 大白话系列之C#委托与事件讲解大结局

    声明:本系列非原创,因为太精彩才转载,如有侵权请通知删除,原文:http://www.cnblogs.com/wudiwushen/archive/2010/04/20/1698795.html 今天 ...

  7. 白话系列之实现自己简单的mvc式webapi框架

    前言:此文为极简mvc式的api框架,只当做入门api的解析方式,并且这里也不算是mvc框架,因为没有view层,毕竟现在大部分都属于前后端分离,当然也可以提供view层,因为只是将view当做文本返 ...

  8. 并发系列5-大白话聊聊Java并发面试问题之微服务注册中心的读写锁优化【石杉的架构笔记】

  9. 并发系列4-大白话聊聊Java并发面试问题之公平锁与非公平锁是啥?【石杉的架构笔记】

随机推荐

  1. javaScript入门1--组成,基本使用

    javaScript:脚本语言,最初是为了实现在客户端进行的表单验证以减少服务器的数据交互次数,如今可用在页面交互,计算,拥有了闭包,匿名(拉姆达)函数,甚至元编程等特性. javaScript实现的 ...

  2. C#中,为什么结构体也可以设置构造函数?

    结构体派生自ValueType,ValueType派生自Object,可访问Object的方法.结构体是一种缩小版的类.结构体不能继承.结构体总是有一个无参数的默认构造函数,不允许替换.结构体可指定字 ...

  3. TensorFlow安装与测试

    官网:http://tensorflow.org/安装步骤:1.sudo apt-get install python-pip python-dev python-virtualenv 2.virtu ...

  4. FZU 1686 神龙的难题 (DLX)

    神龙的难题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  5. Toad for Oracle 12.1下载地址

    32 位版: http://us-downloads.quest.com/Repository/support.quest.com/Toad for Oracle/12.1/Software/Toad ...

  6. [设计模式]<<设计模式之禅>>抽象工厂模式

    1 女娲的失误 上一篇讲了女娲造人的故事.人是造出来了,世界也热闹了,可是低头一看,都是清一色的类型,缺少关爱.仇恨.喜怒哀乐等情绪,人类的生命太平淡了,女娲一想,猛然一拍 脑袋,忘记给人类定义性别了 ...

  7. Linux系统内核制作和内核模块的基础

    Linux系统内核制作 1.清除原有配置与中间文件 x86:  make distclean arm:  make distclean 2.配置内核 x86:  make menuconfig arm ...

  8. Python性能测试

    python -m profile xxx.py > log.txt 打开log.txt查看,搜索你所关心的方法调用耗费的时间. profile的统计结果分为ncalls.tottime.per ...

  9. HTML5与CSS3基础教程第八版学习笔记7~10章

    第七章,CSS构造块 CSS里有控制基本格式的属性(font-size,color),有控制布局的属性(position,float),还有决定访问者打印时在哪里换页的打印控制元素.CSS还有很多控制 ...

  10. sql中在查询时两列合并为一列

    select  a + ' '+b  as ab from tableName 如果是有整型的(例,b字段为int类型): select a +' '+Convert(VARCHAR(50),b) a ...