zoukankan      html  css  js  c++  java
  • .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

  • 相关阅读:
    自我介绍
    企业级应用与互联网应用差异
    Java EE 目标
    自我评价
    第二周———搜查令
    软件工程项目____搜查令
    结对项目--黄金点游戏(邓乐&曾亮)
    wordcount程序
    四则运算 来自 http://www.cnblogs.com/ys1101/p/4368103.html
    问题
  • 原文地址:https://www.cnblogs.com/wintersun/p/2303856.html
Copyright © 2011-2022 走看看