c#委托和事件的介绍

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

(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).在类中申明清空委托方法,依次循环去除委托引用。

方法如下:

c#委托和事件的介绍
      public MethodDelegate OnDelegate;
public void ClearDelegate()
{
while (this.OnDelegate != null)
{
this.OnDelegate -= this.OnDelegate;
}
}
c#委托和事件的介绍

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

  方法如下:

c#委托和事件的介绍
        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;
}
}
}
c#委托和事件的介绍
 
委托还有一个功能就是多播这里就不在介绍这个比较简单
 

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

上一篇:java机试要点


下一篇:OS X EI Capitan 10.11.4中sudo无法起作用的解决方法