有使用过JS的朋友,相信都知道function。JS中的function是可以在里面在定义一个作为内部使用的。有时为了控制作用域,或者这种小函数只在这个函数体内会使用,所以就不希望在外部在作额外的定义。那C#中有没有这样类似的方式呢?答案是有的。

在C#中要实现,需要用到的是委托和lambda表达式。对于lambda表达式,是可以实现匿名函数定义和挂接委托事件的。具体的可参见该文C#利用lambda实现委托事件的挂接

要实现函数内创建内部函数,至少有两种方式可以用。

第一种:Func<>.

第二种:Action<>

Func和Action本质上都是委托,所不同的是Func可以输出返回值,而Action是没有返回值。下面给出实现的代码。

 private void outputInfo(string info)
{
Func<int,string, string> format = (count,message) =>
{
return message + " count:" + count.ToString();
}; Action<string> showMessage = (message) =>
{
Console.WriteLine(message);
}; string formatInfo = format(1, info);
showMessage(formatInfo);
}

在outputInfo函数中又定义了两个函数format和showMessage。

其中format的前两个参数是输入参数,第三个参数是输出参数,即返回值。对于Func是必须要有返回值的,所以Func至少也要有一个输出参数(可以在IDE中对Func看看重载)。紧接在format等号后面的是lambda表达式。需要特别注意的是,lambda表达式中的参数是输入参数,而且是与Func所指定的参数类型是一一对应的,也就是说count对应的是Func中的int类型,而message对应的是Func中的string类型,而lambda后在的内容(大括号内的)是具体的实现,其中的return的返回值所对应的类型是Func的最后一个参数类型,即string类型。

showMessage的参数只有输入参数,没有返回值的。这里只有一个string类型的输入参数。

在实际运用中时,对于Func和Action的类型可以灵活的定义,可以极大的简化大码,提高重用率。

C#利用lambda在函数中创建内部函数的更多相关文章

  1. 利用(CMD)在Django中创建文件

    django项目的创建(在CMD中) 1.切换到你想要存储项目的位置,我这里保存在桌面上 cd Desktop 2.创建一个django项目,项目名叫guest django-admin startp ...

  2. 利用Lambda获取类中属性名称

    public class TypeInfoHelper { public static string GetPropertyName<T>(Expression<Func<T, ...

  3. C++ 利用template给函数中的变量赋初值

    #include <iostream> template<int base> void echo(int add) { int sum=add+base; std::cout& ...

  4. 《Entity Framework 6 Recipes》中文翻译系列 (21) -----第四章 ASP.NET MVC中使用实体框架之在页面中创建查询和使用ASP.NET URL路由过虑

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 4.2. 构建一个搜索查询 搜索数据是几乎所有应用的一个基本功能.它一般是动态的,因 ...

  5. MediaPlayer中创建AudioTrack的过程

    使用MediaPlayer播放音视频时,会创建AudioTrack对象用于播放音频数据.下面就来看看MediaPlayer创建AudioTrack的过程: 1.创建AudioTrack对象MediaP ...

  6. Flask从入门到精通之在视图函数中处理表单

    在新版hello.py 中,视图函数index() 不仅要渲染表单,还要接收表单中的数据.更新后的index() 视图函数如下: @app.route('/') def index(): name = ...

  7. Python中通过函数对象创建全局变量

    先看下面这段代码,显然无法work. 因为代码试图在TestVariableScope()中引用一个没有被定义的变量a.所以必须报错,如下图-1. 不过如果你将第2行代码注释掉.代码就能跑通了,如图- ...

  8. JS中创建函数的三种方式及区别

    1.函数声明 function sum1(n1,n2){ return n1+n2; }; 2.函数表达式,又叫函数字面量 var sum2=function(n1,n2){ return n1+n2 ...

  9. zk框架中利用map类型传值来创建window,并且传值

    @Command @NotifyChange("accList") public void clear(@BindingParam("id") String a ...

随机推荐

  1. Web前端开发工程师编程能力飞升之路

    [背景] 如果你是刚进入web前端研发领域,想试试这潭水有多深,看这篇文章吧:如果你是做了两三年web产品前端研发,迷茫找不着提高之路,看这篇文章吧:如果你是四五年的前端开发高手,没有难题能难得住你的 ...

  2. 关于python中的unicode字符串的使用

    基于python2.7中的字符串: unicode-->编码encode('utf-8')-->写入文件 读出文件-->解码decode('utf-8')-->unicode ...

  3. MFC类目录及头文件(转)

    类 描述 头文件 CAnimateCtrl 自动化通用控件 afxcmn.h CArchive afx.h CArchiveException afx.h CArray afxtempl.h CAsy ...

  4. win7 提示"Windows 无法连接到System Event Notification Service服务......"的解决办法

    登录win7系统,突然出现如图1的提示,无线网络中断,不能上网,多次插拔无线网卡问题依然. 图1 解决过程如下: 1.检查网卡硬件状况,在设备管理器中查看网卡现象正常,排除网卡硬件故障. 2.查看服务 ...

  5. vim开发环境配置

    一.大饱眼福 看了效果图,肯定有人说, 这都有啥功能?就花哨? 告诉你,你说花哨就错了,开玩笑?我们程序猿可都是实打实的人,说谎都不会,咋会忽悠人呢. 下面我来告诉你,这都有些什么功能: 文件索引功能 ...

  6. leetcode—sudoku solver

    1.题目描述 Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicate ...

  7. Best Practices for Speeding Up Your Web Site

    The Exceptional Performance team has identified a number of best practices for making web pages fast ...

  8. mysql 的 GROUP_CONCAT

    GROUP_CONCAT 通常跟 group by 一起用,但也可以不用.例:select GROUP_CONCAT(pct_id) as pct_ids from (select max(pct_i ...

  9. [POJ] #1006# Biorhythms : 最小公倍数/同余问题

    一. 题目 Biorhythms Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 127263   Accepted: 403 ...

  10. java.io.IOException: Messenger was closed

    程序运行一段时间后抛出异常java.io.IOException: Messenger was closed,不知道是啥原因? ———————————————————————————————————— ...