c# 委托Func简单实践
最近才真正的接触委托,所以针对Func类型的委托,做一个实践练习

首先说一些我对委托的初级理解:“就是把方法做参数,传进委托方法里”。

平时用到的有三种:
1、把方法A()传进委托,委托中直接执行方法A()
2、把方法A(int index)传进委托,委托中创建A中的参数index,然后执行方法A(index)
3、把方法A(int index)index值都传进委托,委托中直接执行方法A(index)

Func在我的理解中是一个必须有返回值的,可以使用范型委托

我可以把Func比喻成一个面包房,与上面三种方法对应例子就是:
1、我把做面包的方法,告诉给面包房,面包房可以自动生产一个面包出来。
2、我把做面包的方法(此方法需要人工实现),告诉给面包房,面包房找一个员工,根据方法,做出来一个面包。
3、我租借面包房的地方,我自己待着做面包的方法(此方法需要人工),自己通过方法,做出来一个面包。

以下为代码实现过程。

首先建立两个实体 客人(Customer) 与 员工(Employee)

Customer:

/// <summary>
/// 客人
/// </summary>
public class Customer
{
public string Name { get; set; }
}

Employee:

/// <summary>
/// 员工
/// </summary>
public class Employee
{
public string Name { get; set; }
}

然后 建立面包实体(BreadInfo)

/// <summary>
/// 面包
/// </summary>
public class BreadInfo
{
/// <summary>
/// 名称
/// </summary>
public string Name { get; set; }
}

建立一个面包房类(Bakery)

/// <summary>
/// 面包房
/// </summary>
public class Bakery
{
/// <summary>
/// 做食物
/// </summary>
/// <typeparam name="T">范型(食物类型)</typeparam>
/// <param name="func"></param>
/// <returns></returns>
public static T MakeFood<T>(Func<T> func)
{
//直接执行方法
return func();
} /// <summary>
/// 通过面包房员工 做食物
/// </summary>
/// <typeparam name="T">范型(食物类型)</typeparam>
/// <param name="func"></param>
/// <returns></returns>
public static T MakeFoodByEmployee<T>(Func<Employee, T> func)
{
//找一个面包房员工
Employee e = new Employee(); //将参数e(面包房员工)传进方法中
return func(e);
} /// <summary>
/// 租借面包房 做食物
/// </summary>
/// <typeparam name="T">范型(食物类型)</typeparam>
/// <param name="func"></param>
/// <param name="c"></param>
/// <returns></returns>
public static T BorrowMakeFood<T>(Func<Customer, T> func, Customer c)
{
//将参数c(客户)传进方法中
return func(c);
}
}

建立一个方法类(Function)  方法中有做面包的三种方式

/// <summary>
/// 做面包方法类
/// </summary>
public class Function
{
/// <summary>
/// 直接做面包
/// </summary>
/// <returns></returns>
public static BreadInfo MakeBread()
{
return new BreadInfo();
} /// <summary>
/// 用过客户自己 做面包
/// </summary>
/// <param name="c">客户自己</param>
/// <returns></returns>
public static BreadInfo MakeBreadByCustomer(Customer c)
{
return new BreadInfo();
} /// <summary>
/// 用过面包房员工 做面包
/// </summary>
/// <param name="e">面包房员工</param>
/// <returns></returns>
public static BreadInfo MakeBreadByEmployee(Employee e)
{
return new BreadInfo();
}
}

完毕以后 就可以调用了。

//直接让面包房自动 做面包
var f = Bakery.MakeFood(Function.MakeBread); //通过面包房员工 做面包(员工是面包房自动提供的 不用传进去)
var f1 = Bakery.MakeFoodByEmployee(Function.MakeBreadByEmployee); //客户自己租借面包房地点 做面包(客户自己需要传进去)
Customer c = new Customer();
var f2 = Bakery.BorrowMakeFood<BreadInfo>(Function.MakeBreadByCustomer, c);

一个简单Func类型委托实现完毕,有很多不足,希望各位大大能够指正

c#中,委托Func的简单实践的更多相关文章

  1. 2.C#中通过委托Func消除重复代码

    阅读目录   一:重复的代码 二:C#中通过委托Func消除重复代码 一:重复代码    public class Persion { public string Name { get; set; } ...

  2. C#中委托的理解

    请注意,这只是个人关于C#中委托的一点点理解,参考了一些博客,如有不周之处,请指出,谢谢! 委托是一种函数指针,委托是方法的抽象,方法是委托的实例.委托是C#语言的一道坎,明白了委托才能算是C#真正入 ...

  3. C#不用union,而是有更好的方式实现 .net自定义错误页面实现 .net自定义错误页面实现升级篇 .net捕捉全局未处理异常的3种方式 一款很不错的FLASH时种插件 关于c#中委托使用小结 WEB网站常见受攻击方式及解决办法 判断URL是否存在 提升高并发量服务器性能解决思路

    C#不用union,而是有更好的方式实现   用过C/C++的人都知道有个union,特别好用,似乎char数组到short,int,float等的转换无所不能,也确实是能,并且用起来十分方便.那C# ...

  4. C#中委托、匿名函数、Lambda表达式的一些个人理解

    0x01定义一个委托,相当于定义一个可以存储方法的特殊变量类型 下面我们看具体的代码,通过代码更好理解 delegate void IntMethodInvoker(int x); 这行代码就是声明一 ...

  5. Thrift简单实践

    0.什么是RPC RPC(Remote Procedure Call - 远程过程调用),是通过网络从远程计算机上请求服务,而不需要了解底层网路技术的细节.简单点说,就是像调用本地服务(方法)一样调用 ...

  6. Deferred在jQuery和Angular中的使用与简单实现

    Deferred在jQuery和Angular中的使用与简单实现 Deferred是在jQuery1.5版本中加入的,并且jQuery使用它完全重写了AJax,以前也只是偶尔使用.但是上次在使用Ang ...

  7. Java 异步处理简单实践

    Java 异步处理简单实践 http://www.cnblogs.com/fangfan/p/4047932.html 同步与异步 通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异 ...

  8. Android 设计随便说说之简单实践(合理组合)

    上一篇(Android 设计随便说说之简单实践(模块划分))例举了应用商店设计来说明怎么做模块划分.模块划分主要依赖于第一是业务需求,具体是怎么样的业务.应用商店则包括两个业务,就是向用户展示appl ...

  9. C#中委托和事件

    目 录 将方法作为方法的参数 将方法绑定到委托 更好的封装性 限制类型能力 范例说明 Observer 设计模式简介 实现范例的Observer 设计模式 .NET 框架中的委托与事件 为什么委托定义 ...

随机推荐

  1. 使用entity framework开发oracle

    A.vs2010 SP1 B.ODAC(http://www.oracle.com/technetwork/database/windows/downloads/index-101290.html) ...

  2. 各种排序方法的JS实现

    各种排序算法的对比总结如下表所示: 冒泡排序: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完 ...

  3. JAVA多线程经典问题 -- 生产者 消费者

    工作2年多来一直也没有计划写自己的技术博客,最近辞职在家翻看<thingking in JAVA>,偶尔看到了生产者与消费者的一个经典的多线程同步问题.本人在工作中很少使用到多线程以及高并 ...

  4. sftp 服务器外网访问设置

    这个是需要在本机上设定用户名的.根据不同的用户权限.然后让不同的人来到本机上取得数据. 参考一下有用的文章:http://www.ericstockwell.com/?p=54       (强烈建议 ...

  5. 在Linux Mint13下编译安装mono运行时

    最近一直想体验下mono在web开发上到底进展到什么程度,挑战一下它对web开发的极限.因为asp.net mvc本身依赖windows平台的东西不太多,所以这些assembly移植到mono/lin ...

  6. codeforces 6A. Triangle

    A. Triangle time limit per test 2 seconds memory limit per test 64 megabytes input standard input ou ...

  7. java编程思想笔记(一)——面向对象导论

    1.1 抽象过程 1.所有编程语言都提供抽象编程机制. 2.人们所能够解决的问题的复杂性直接取决于抽象的类型(所抽象的是什么)和质量. 3."命令式"语言(basic,c等)都是对 ...

  8. 【.NET-EF】Entity Framework学习笔记2 - 增删改(没查询)

    学习描述:用EF就像是省略了做实体类和DAL类,感觉是很方便,废话不多说,直接写步骤: 1.创建EF的edmx文件 这个其实在笔记1已说过,不过有些细节也要说,所以再说一遍,这里使用的是EF 6.1版 ...

  9. CMD杀进程 例如:杀8080端口的进程

    首先:端口被占用的报错形式如下 说明8080端口被占用 解决方案一:查找pid,根据pid去任务管理器的进程中结束占用8080端口号的进程 1.首先按快捷键windows+R,在运行框里输入cmd,如 ...

  10. 浅谈CSS3 box-reflect 属性

    今天说一下 CSS3的box-reflect属性,也就是倒影特效. 语法: box-reflect:包括3个值. 1. direction 定义方向,取值包括 above . below . left ...