asp.net開發中 Delegate,Action,Func,Predicate的區別

來源:互聯網
上載者:User

asp教程.net開發中 Delegate,Action,Func,Predicate的區別

類似Linq,Lamda運算式等許多新的程式寫法層次不窮。與之相關的Delegate,Action,Func,Predicate的使用和區別也常常讓大家迷惑,此處就結合實際的應用,對其進行詳細的說明。

在書寫代碼時,常常會用到委託,這個在winform下較常見,但自訂Delegate時,我們常常發現Delegate必須全域可見,才能在需要的地方進行使用,而對於私人的delegate對象,在本類中進行使用,這似乎是不方便的。下邊我們來看傳統的Delegate的寫法。

public delegate void MyDelegate(string name);
    public class MyBlogBase
    {
        private MyDelegate mydelegate;
    }

 

 


必須保證MyDelegate放在類的外邊,才能在其他地方可見,並使用,Action,Func的出現改變了這一局面,這兩個其實說白了就是系統定義好的Delegate,他有很多重載的方法,便於各種應用情況下的調用。他在系統的System命名空間下,因此全域可見。下文就說明Action,Action有多個重載,下文已Action<T>為例進行說明

Action<T>:封裝一個方法,該方法只有一個參數並且不傳回值。其中T是可接收的任何類型。使用代碼如下:

public class MyBlogBase
    {   
        public string myName;
        Action<string> myAction;   
        public MyBlogBase()
        {
            //myAction = delegate(string curName) { myName = curName; };
            //myAction = new Action<string>(SetAction);
            myAction = curname => { myName = curname; };
          
        }
        private void SetAction(string name)
        {
            myName = name;
        }
    }

 

 


在上例中,給出了3種使用Action的方法,方法一:採用匿名委託,方法二:指定一個實際的方法。方法三:使用Lamda運算式。以上3中用法均可運行。

在實際應用中要比原始的定義Delegate方便,靈活。那麼Func呢?

Func<T in,T Tresult>:封裝一個具有一個參數並返回 TResult 參數指定的類型值的方法。其實個人感覺,Func和Action的區別很明顯,也很直接。二者都是委託,但Func能返回函數執行結果,而Action傳回型別是Void,這個區別很明顯,在具體的項目中,也很容易確定該使用那個。下文就說明具體Func的代碼調用:

 public string myName;
        Func<string, string> myFunc;    
        public MyBlogBase()
        {          
            //myFunc = delegate(string curName) { return curName.ToUpper(); };
            //myFunc = new Func<string, string>(SetFunc);
            myFunc = name => { return name.ToUpper(); };       
        }     
        private string SetFunc(string name)
        {
            return name.ToUpper();
        }      
        public void StartFun(string curName)
        {
            myName = myFunc(curName);
        }

 

 


如上3種寫法,都是合適的Func定義,大家可以選擇適合自己的編程模式,其實匿名方法,有個優點,就是可以直接使用當前函數出現的變數,代碼更簡潔,但可能有些人覺得不易讀。

Predicate<T>:也是一種委託,表示定義一組條件並確定指定對象是否符合這些條件的方法.此方法常在集合的尋找中被用到,如:數組,正則拼配的結果集中被用到。使用此方法快捷方便,使用代碼如下:

Predicate<int> myPredicate;
        int[] myNum = new int[8] { 12, 33, 89, 21, 15, 29, 40, 52 };
       public int[] myResult;
        public MyBlogBase()
        {
            myPredicate = delegate(int curNum) 

            { if (curNum % 2 == 0) return true; 

              else return false; 

            };
        } 
        public void StartPredicate()
        {
            myResult = Array.FindAll(myNum, myPredicate);
        }

 

 


上例中說明了Predicate的使用,FindAll方法中,參數2即是一個Predicate,在具體的執行中,每一個數組的元素都會執行指定的方法,如果滿足要求返回true,並會被存放在結果集中,不符合的則被剔除,最終返回的集合,即是結果判斷後想要的集合,此方法應用情境感覺像迭代中的yield。當然此方法也可以書寫上邊類似Action和Func的3中方式,此處省略。

為了更好的驗證運行效果,添加Test項目及進行測試,把代碼粘帖出來分享一下:

[TestMethod]
        public void TestAction()
        {
            MyBlogBase blogObj = new MyBlogBase();
            blogObj.StartAction("ywg369");
            Assert.AreEqual("ywg369", blogObj.myName);
        }
        [TestMethod]
        public void TestFunc()
        {
            MyBlogBase blogObj = new MyBlogBase();
            blogObj.StartFun("ywg369");
            Assert.AreEqual("YWG369", blogObj.myName);
        }
        [TestMethod]
        public void TestPredicate()
        {
            MyBlogBase blogObj = new MyBlogBase();
            blogObj.StartPredicate();
            Assert.AreEqual(3, blogObj.myResult.Length);
        }

經過驗證,運行良好,各個方法都按照期望的結果運行成功。通過此處對Delegate,Action,Func,Predicate的使用有個大致的瞭解,在具體的應用中根據

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.