.net中用Action等委托向外传递参数

时间:2023-03-09 03:05:27
.net中用Action等委托向外传递参数

原文:.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