委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。事件是一种特殊的委托。

(1). delegate

        delegate我们常用到的一种声明

    Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型。

    例:public delegate int MethodtDelegate(int x, int y);表示有两个参数,并返回int型。

    delegate  void OutPut(string str);

       private static event OutPut output;

  output+=new OutPut(Say);
           output("hello new test");

  private static void Say(string str)
       {
           Console.WriteLine(str);
       }

delegate方式的委托的另一种形式我觉得也是有必要记录下来的

  public delegate void BoilerLogHandler(string status);

      // 基于上面的委托定义事件       public event BoilerLogHandler BoilerEventLog;

      public void LogProcess()      

{          string remarks = "O. K";        

  Boiler b = new Boiler(100, 12);        

  int t = b.getTemp();         

int p = b.getPressure();        

  if(t > 150 || t < 80 || p < 12 || p > 15)        

  {             remarks = "Need Maintenance";          }        

  OnBoilerEventLog("Logging Info:\n");         

OnBoilerEventLog("Temparature " + t + "\nPressure: " + p);       

   OnBoilerEventLog("\nMessage: " + remarks);    //也可以直接用BoilerEventLog(message);  放在一个方法里面个人认为可能是封装     

  }

      protected void OnBoilerEventLog(string message)        //个人理解这个方法是封装原则

{          if (BoilerEventLog != null)          {           

  BoilerEventLog(message);         

}      

}   

  boilerEvent.BoilerEventLog += new
         DelegateBoilerEvent.BoilerLogHandler(Logger);   //这是另一种

 

  (2). Action

       Action是无返回值的泛型委托。

   Action 表示无参,无返回值的委托

   Action<int,string> 表示有传入参数int,string无返回值的委托

  Action<int,string,bool> 表示有传入参数int,string,bool无返回值的委托

       Action<int,int,int,int> 表示有传入4个int型参数,无返回值的委托

   Action至少0个参数,至多16个参数,无返回值。

例如:

  static void Logger(string info)
      {
         
         Console.WriteLine(info);
      }

  Action<string> strAction;  
          strAction = Logger;
          strAction("hello word");

 

   (3). Func

   Func是有返回值的泛型委托

   Func<int> 表示无参,返回值为int的委托

   Func<object,string,int> 表示传入参数为object, string 返回值为int的委托

   Func<object,string,int> 表示传入参数为object, string 返回值为int的委托

   Func<T1,T2,,T3,int> 表示传入参数为T1,T2,,T3(泛型)返回值为int的委托

   Func至少0个参数,至多16个参数,根据返回值泛型返回。必须有返回值,不可void

 

 Func<int, int, int> TestFunc;
           TestFunc=new Func<int, int, int>(Add);
           TestFunc(1, 2);

 

  private static int Add(int x, int y)
       {
           Console.WriteLine((x+y).ToString());
           return 0;
       }

 

  (4) .predicate

   predicate 是返回bool型的泛型委托

   predicate<int> 表示传入参数为int 返回bool的委托

   Predicate有且只有一个参数,返回值固定为bool

   例:public delegate bool Predicate<T> (T obj)

 Predicate<string> Test2;
           Test2 = Addstring;
           if (Test2("哈哈哈哈哈"))
           {
               Console.WriteLine("predicate返回值为bool类型");
           }

 public static bool Addstring(string str)
       {
           Console.WriteLine(str);
           return true;
       }

 

委托的清空

(1).在类中申明清空委托方法,依次循环去除委托引用。

         方法如下:

 

复制代码
      public MethodDelegate OnDelegate;                
        public void ClearDelegate()        
        {             
            while (this.OnDelegate != null) 
            {                 
                this.OnDelegate -= this.OnDelegate;  
            }        
        } 
复制代码

 

  (2).如果在类中没有申明清空委托的方法,我们可以利用GetInvocationList查询出委托引用,然后进行去除。  

 

  方法如下:

 

复制代码
        public MethodDelegate OnDelegate;       static void Main(string[] args)
        {
            Program test = new Program();

            if (test.OnDelegate != null) 
            { 
                System.Delegate[] dels = test.OnDelegate.GetInvocationList(); 
                for (int i = 0; i < dels.Length; i++) 
                {
                    test.OnDelegate -= dels[i] as MethodDelegate;
                }
            }
        }
复制代码
 
委托还有一个功能就是多播这里就不在介绍这个比较简单
 

 

4.委托的特点

  委托类似于 C++ 函数指针,但它们是类型安全的。   委托允许将方法作为参数进行传递。   委托可用于定义回调方法。   委托可以链接在一起;例如,可以对一个事件调用多个方法。   方法不必与委托签名完全匹配。

 

  5.总结:

 

    Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型

 

  Func可以接受0个至16个传入参数,必须具有返回值

 

  Action可以接受0个至16个传入参数,无返回值

 

  Predicate只能接受一个传入参数,返回值为bool类型

 

 

 

  详细参考:http://www.fengfly.com/plus/view-209140-1.html

 

       http://www.cnblogs.com/foolishfox/archive/2010/09/16/1827964.html