2012年11月26日 星期一

[C#] 快速了解泛型委派


Action & Func


Action<T, T…>  沒有回傳值的泛型委派
Func<T,T…>  可以回傳值的泛型委派

對小弟來說,泛型委派和Delegate最大的差別就是,不用先宣告一個Delegate定義名稱。
使用上較方便。

直接看範例

Sample


先定義一個CName物件,裡面會放要委派的方法。

public class CName :IDisposable
{
        private String sName;
        public CName(string name)
        {   this.sName = name;   }

        /// <summary>
        /// 沒有參數,沒有回傳值
        /// </summary>
        public void DisplayToConsole() {   //…     }

        /// <summary>
        /// 一個參數,回傳String型別
        /// </summary>
        public String DisplayToWindow(String sDesc) {   //…   }

        /// <summary>
        /// 兩個參數,回傳String型別
        /// </summary>
        public String DisplayToWindow(String sDesc01, String sDesc02) {   //…   }

        /// <summary>
        /// 泛型:兩個個參數,無回傳值
        /// </summary>
        public void Combine<T>(T itemA, T itemB) {    //…    }
       
        /// <summary>
        /// 泛型:兩個個參數,回傳String型別
        /// </summary>
      
        public String Combine_WithRtnVal<T>(T itemA, T itemB) {    //…    }
}



Delegate

public delegate void ShowName();
/* 測試Delegate */
using (CName cName = new CName("Delegate測試"))
{
   ShowName _showName = cName.DisplayToConsole;
   _showName();
}


Action 匿名委派

/* 測試Action匿名委派 */
using (CName cName = new CName("Action匿名委派"))
{
    Action _showNameActDel = cName.DisplayToConsole;
    _showNameActDel();           
}


Generic Action 泛型匿名委派

/* 測試Action泛型匿名委派 */
using (CName cName = new CName("Generic Action"))
{
   Action<String, String> _showNameActGen = (x, y) => cName.Combine(x, y);
   //Action<String> _showNameActGen = cName.Combine<String>;
  _showNameActGen("1", "2");           
}


PS. Action<String, String> 指的是委派的方法裡面須帶兩個String參數。


Generic Func

/* 測試Func泛型匿名委派 */
using (CName cName = new CName("Generic Func"))
{
    Func<int, int, String> _showNameFuncGen = (x, y) => cName.Combine_WithRtnVal(x, y);
    String sRslt = _showNameFuncGen(1, 2);
}
PS. Func<int, int, String> 指的是委派的方法裡面須帶兩個int參數,回傳String

如果意猶未盡,可以參考MSDN的詳細說明 !

           

沒有留言:

張貼留言