.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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM