一般我们可以使用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。