C#利用lambda在函数中创建内部函数
有使用过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在函数中创建内部函数的更多相关文章
- 利用(CMD)在Django中创建文件
django项目的创建(在CMD中) 1.切换到你想要存储项目的位置,我这里保存在桌面上 cd Desktop 2.创建一个django项目,项目名叫guest django-admin startp ...
- 利用Lambda获取类中属性名称
public class TypeInfoHelper { public static string GetPropertyName<T>(Expression<Func<T, ...
- C++ 利用template给函数中的变量赋初值
#include <iostream> template<int base> void echo(int add) { int sum=add+base; std::cout& ...
- 《Entity Framework 6 Recipes》中文翻译系列 (21) -----第四章 ASP.NET MVC中使用实体框架之在页面中创建查询和使用ASP.NET URL路由过虑
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 4.2. 构建一个搜索查询 搜索数据是几乎所有应用的一个基本功能.它一般是动态的,因 ...
- MediaPlayer中创建AudioTrack的过程
使用MediaPlayer播放音视频时,会创建AudioTrack对象用于播放音频数据.下面就来看看MediaPlayer创建AudioTrack的过程: 1.创建AudioTrack对象MediaP ...
- Flask从入门到精通之在视图函数中处理表单
在新版hello.py 中,视图函数index() 不仅要渲染表单,还要接收表单中的数据.更新后的index() 视图函数如下: @app.route('/') def index(): name = ...
- Python中通过函数对象创建全局变量
先看下面这段代码,显然无法work. 因为代码试图在TestVariableScope()中引用一个没有被定义的变量a.所以必须报错,如下图-1. 不过如果你将第2行代码注释掉.代码就能跑通了,如图- ...
- JS中创建函数的三种方式及区别
1.函数声明 function sum1(n1,n2){ return n1+n2; }; 2.函数表达式,又叫函数字面量 var sum2=function(n1,n2){ return n1+n2 ...
- zk框架中利用map类型传值来创建window,并且传值
@Command @NotifyChange("accList") public void clear(@BindingParam("id") String a ...
随机推荐
- Golang几个常用记录日志对比
go语言有一个标准库,log,提供了最基本的日志功能,但是没有什么高级的功能,如果需要高级的特性,就需要使用第三方包,下面是一些候选的包: go_tmlog https://code.google.c ...
- 微信公众平台开发localStorage数据总是被清空
我把现在项目中的用户数据存储过程改成本地的,只用localStorage,但是随之而来很多问题,原因就是localStorage只有很短的有效时间,退出公众号,关闭微信都会清空.最不能容忍的是用户还在 ...
- Drupal 7.23:函数drupal_alter()注释
/** * Passes alterable variables to specific hook_TYPE_alter() implementations. * * This dispatch fu ...
- SQL Server 2008 备份改进版
1.Add compressing function with 7-Zip 2.With tool win.rar code so you can change it if you want USE ...
- <javascript高级程序设计>笔记
1.要讲一个值转换成其对应的Boolean类型 ,可以调用转型函数Boolean(). var message=“hello world!”; var messageAsBoolean=Boolean ...
- 离线树状数组 hihocoder 1391 Countries
官方题解: // 离线树状数组 hihocoder 1391 Countries #include <iostream> #include <cstdio> #include ...
- pip install 下载慢的问题
建个文件 ~/.pip/pip.conf, 内容如下 [global] timeout = 6000 index-url = https://pypi.doubanio.com/simple [ins ...
- 门户级UGC系统的技术进化路线——新浪新闻评论系统的架构演进和经验总结(转)
add by zhj:先收藏了 摘要:评论系统是所有门户网站的核心标准服务组件之一.本文作者曾负责新浪网评论系统多年,这套系统不仅服务于门户新闻业务,还包括调查.投票等产品,经历了从单机到多机再到集群 ...
- Working with Sprites
[Working with Sprites] 1.An SKSpriteNode object can be drawn either as a rectangle with a texture ma ...
- Intellij IDEA 14.x 中的Facets和Artifacts的区别
Facets和Artifacts的区别: Facets 表示这个module有什么特征,比如 Web,Spring和Hibernate等: Artifact 是maven中的一个概念,表示某个modu ...