.net中用Action等委托向外传递参数
一般我们可以使用ref,out达到向外传递参数目的。 Action<T>是一个特殊的委托,除了常规应用。我们还可以用它来实现简单地向外传递参数。直接看下面的UnitTest代码:
1: [TestMethod]
2: public void PassOutParametersUsingDelegate()
   3: {
4: int i = 0;
5: string messgae = string.Empty;
6: int? addedNumber = 1;
7:
8: //It is pass parameter by Action<T1,T2>
9: Foo1((a, b) =>
  10:     {
11: i = a;
12: messgae = b;
13: });
14:
15: //It is pass parameter by Func<T1,T2,TResult>
16: Foo2((a, b) =>
  17:     {
18: i = a;
19: messgae = b;
20: return addedNumber;
21: });
22:
23: Foo2((a, b) =>
  24:     {
25: return a+100;
26: });
27:
  28:     Assert.AreEqual("i=15,message=fifteen", string.Format("i={0},message={1}", i, messgae));
29:
30:
31: }
32:
33: private void Foo1(Action<int, string> action)
  34: {
35: int number = 15;
36: string msg = "fifteen";
37:
38: action(number, msg);
39: }
40:
41: private void Foo2(Func<int, string, int?> func)
  42: {
43: int number = 15;
44: string msg = "fifteen";
45:
46: int? tempInt = func(number, msg);
47: }
上面的代码我们演示使用Action<T>, 有注意到我们把a,b两个值传递给方法外面的变量。同样的,我们用Func<TResult>可以实现。为什么会有这样的代码产生呢?源于这样的场景,有一个方法只有一个输入参数,返回void 。我们为了不改变原来这个方法参数签名,增加新的子方法,使用Action<T>向外传递参数。然后再用原方法Wrap新的子方法。
关于Action<T>还有很多精彩的运用,Builder模式与Fluent接口。
希望对您开发有帮助。
作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog。
.net中用Action等委托向外传递参数的更多相关文章
- struts 页面调用Action的指定方法并传递参数
		如果为action配置了类,那么默认就会执行Action类的excute方法,Action类的写法三种: ① public class Action1 { public String execute( ... 
- JSP页面间传递参数的5种方法
		JSP页面间传递参数是经常需要使用到的功能,有时还需要多个JSP页面间传递参数.下面介绍一下实现的方法. (1)直接在URL请求后添加 如:< a href="thexuan.jsp? ... 
- jsp 页面间传递参数
		JSP页面间传递参数是经常需要使用到的功能,有时还需要多个JSP页面间传递参数.下面介绍一下实现的方法. (1)直接在URL请求后添加 如:< a href="thexuan.jsp? ... 
- winform总结2> Action<> ,Action,func<>,委托相关的理解
		1,他们是什么: Action 封装一个方法,该方法不具有参数并且不返回值. Action<> 封装一个方法,该方法具有最多16个参数并且不返回值. func<> 封装一个具有 ... 
- 委托、Action泛型委托、Func泛型委托、Predicate泛型委托的用法
		一.举一委托场景:天气很热,二狗子想去买瓶冰镇可乐,但是二狗子很懒,于是他想找个人代他去,于是要有个代理人. 创建代理人之前先定义委托:public delegate string BuyColaDe ... 
- Liferay7 BPM门户开发之40: Form表单的Action到Render的数据传递
		在Form提交后的变量,很多情况是要展现在jsp页面中,这时Action到Render的变量传递就非常有用. 例如,您在数据库中添加了学生的详细信息. 为了实现这一需求,先创建Form表单(学生的细节 ... 
- Func<T>与Action<T>委托泛型介绍:转
		.Net 3.5之后,微软推出了Func<T>与Action<T>泛型委托.进一步简化了委托的定义. Action<T>委托主要的表现形式如下: public de ... 
- Func<T>与Action<T>委托泛型介绍
		.Net 3.5之后,微软推出了Func<T>与Action<T>泛型委托.进一步简化了委托的定义. Action<T>委托主要的表现形式如下: public de ... 
- Struct2 向Action中传递参数(中文乱码问题)
		就是把视图上的值传递到Action定义的方法中 也就是把数据从前台传递到后台 三种方式: 1. 使用action属性接收参数 比如jsp页面: <body> 使用action属性接收参数 ... 
随机推荐
- 学习vi和vim编辑(3):一个简单的文本编辑器(2)
			然后文章,继续评论vi编辑简单的文本编辑命令. 本文主要是删除的文字.复制,运动命令. 删除文本: 正如上一篇文章中讲过的,对于删除命令("d")也具有"(command ... 
- MVC—WebAPI(调用、授权)
			ASP.NET MVC—WebAPI(调用.授权) 本系列目录:ASP.NET MVC4入门到精通系列目录汇总 微软有了Webservice和WCF,为什么还要有WebAPI? 用过WCF的人应该 ... 
- FZU 1686 龙之谜 重复覆盖
			兑换0,1模型,如.注意,数据的范围 #include <stdio.h> #include <string.h> #include <iostream> #inc ... 
- Android CTS測试Fail项改动总结(四)
			Android5.1上的測试 1.android.security.cts.SELinuxDomainTest# testInitDomain fail 打印的log junit.framework. ... 
- OCEANIAERP对接-code盘点机并存储实时库存计划和方案的使用,实时库存,云清查方案
			1. PDA手持设备按键说明 [Tab]键:使输入焦点在控件上切换. [ESC]键:弹出是否退出确认对话框,退出操作界面或程序. [OK]键:确认输入或选择,进入下一步操作. [C]键:删除键 ... 
- Java单链逆转
			本文介绍两种方法单向链表反转.记录,如下面: 1. package com.leetcode; public class ListReverse { public static void main(S ... 
- 谁占用了我的Buffer Pool
			原文:谁占用了我的Buffer Pool 转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/01/11/buffer-pool.aspx 我在做SQL S ... 
- android 渐变drawable
			渐变Drawable它是使用<gradient>的标记的形状Drawable定义子节点的定义. 每个梯度Drawable求至少要有一个startColor和endColor属性,而且支持一 ... 
- 经验36--C#无名(大事,物...)
			有时候,方便代码,它会使用匿名的东西. 1.匿名事件 args.CookieGot += (s, e) => { this ... 
- 理解Java虚拟机体系结构(转)
			1 概述 众所周知,Java支持平台无关性.安全性和网络移动性.而Java平台由Java虚拟机和Java核心类所构成,它为纯Java程序提供了统一的编程接口,而不管下层操作系统是什么.正是得益于Jav ... 
