委託、事務

委託(普通、多播)delegate OutParm delegateName(InParm1,InParm2,......)

類似於函數指針  Delegate int Mydelegate(int a,int b)

用處:回調函數、 篩選規則 (lambda表達式:實質爲泛型委託)

內置泛型委託 

Aciton<int,int> 最多支持16個參數

Func<int,int,int>  最多支持16個參數,最後一個爲返回參數

  //定義實現Where方法

  public delegate bool WhereRuler(object obj);
    public static class ListExpandMethod
    {
        public static void NewWhere(this List<object> list, WhereRuler rule)
        {
            List<object> newlist = new List<object>();
            foreach (var item in list)
            {
                if (rule(item))
                {
                    newlist.Add(item);
                }
            }
            list.RemoveAll(c=>true);
            list.AddRange(newlist);
        }
    }

//調用
List<object> list=new List<object>() { "dai","wei","daiweikuan","wdwdw"};
list.NewWhere(c => c.ToString() == "dai");

 

事件    event delegateName eventName

事件是一種特殊委託類型的實例,一般作爲類成員,主要作用是當類的內部成員發生改變時,能通知類外部的訂閱者

和委託的區別是,限定了委託了在類外部的訪問權限,只能訂閱,無法進行初始化

 /// <summary>
 /// 規則類
 /// </summary>
 public class RuleClass
 {
     private Func<List<int>, int> rule;
     public event Action RuleChange;

     public void SetRule(Func<List<int>, int> rule)
     {
         this.rule = rule;
         RuleChange.Invoke();
     }

     public int GetMax(List<int> ints)
     {
         if (rule != null)
         {
             return rule(ints);
         }
         else { return -1; }

     }
 }


 /// <summary>
 /// 通知類
 /// </summary>
 public class NoticeClass
 {
     public void NoticeRuleChange()
     {
         Console.WriteLine("Rule Is Changed");
     }
 }

//調用
List<int> ints=new List<int>() { 2,3,45,334,2,0};
NoticeClass noticeClass= new NoticeClass();
RuleClass ruleClass = new RuleClass();
ruleClass.RuleChange += noticeClass.NoticeRuleChange; //訂閱規則改變事件
ruleClass.SetRule((list) => { return list[0]; }); //規則發生改變
Console.WriteLine(ruleClass.GetMax(ints));

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章