有使用过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. FreeMarker笔记 第四章 其它

    4.1 自定义指令 4.1.1 简介 自定义指令可以使用macro指令来定义.Java程序员若不想在模板中实现定义指令,而是在Java语言中实现指令的定义,这时可以使用freemarker.templ ...

  2. IntelliJ IDEA 13 Keygen

    import java.math.BigInteger; import java.util.Date; import java.util.Random; import java.util.zip.CR ...

  3. Pig Run on Hadoop, V1.0

    ——安装hadoop参考这篇blog: http://www.cnblogs.com/lanxuezaipiao/p/3525554.html?__=1a36 后面产生的问题,slave和master ...

  4. javascript中=、==、===区别详解

    javascript中=.==.===区别详解今天在项目开发过中发现在一个小问题.在判断n==""结果当n=0时 n==""结果也返回了true.虽然是个小问题 ...

  5. AWS Summit 2014 San Francisco站总结

    我上个月去San Francisco参加了AWS Summit 2014 会议,总结一下参加这个会议的情况. 什么是AWS Summit? AWS Summit 是AWS在全球各地举办的,针对AWS用 ...

  6. HDU1227:Fast Food

    题目链接:Fast Food 题意:一条直线上有n个饭店,问建造k个原料厂(仍旧在商店位置)得到的最小距离 分析:见代码 //一条直线上有n个饭店,问建造k个原料厂(仍旧在商店位置)得到的最小距离 / ...

  7. 【转】大数据以及Hadoop相关概念介绍

    原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4230220.html 感谢! 一.大数据的基本概念 1.1.什么是大数据 大数据指的就是要处理的数据是TB级别以 ...

  8. <一道题>求1 + 2! + 3! + .... + N!

    一道小题,╮(╯▽╰)╭ #include <stdio.h> /*jie cheng * * 1 + 2! + 3! + ... + N! * * */ int factorial(in ...

  9. POJ 3449 Geometric Shapes(判断几个不同图形的相交,线段相交判断)

    Geometric Shapes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1243   Accepted: 524 D ...

  10. Struts ForwardAction Example

    In Struts MVC model, you have to go thought the Action Controller to get a new view page. In some ca ...