委托

来源:互联网 发布:数据库datetime 格式 编辑:程序博客网 时间:2024/04/29 15:33

1.通过委托,可以执行它所引用的方法,并且传递方法的参数。

只要方法的签名与为委托的签名匹配,该方法及其参数就可以被赋予委托。

委托也可以作为参数实现CallBack。

委托也有作用域,然而不能用static关键字。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace DelegateSimple
  5. {
  6.     class Program
  7.     {
  8.         public delegate void MessagePrintDelegate(string msg);
  9.         public delegate int GetCountDelegate(Person p1, Person p2);
  10.         public delegate void LongRunningDelegate(MessagePrintDelegate mpd);
  11.         static void Main(string[] args)
  12.         {
  13.             MessagePrintDelegate mpdDel = new MessagePrintDelegate(MessagePrint);
  14.             LongRunningDelegate lrDel = new LongRunningDelegate(LongRunning);
  15.             GetCountDelegate gcDel = new GetCountDelegate(GetCount);
  16.             int count = gcDel(new Person(), new Person());
  17.             Console.WriteLine("count: {0}", count);
  18.             lrDel(mpdDel);
  19.         }
  20.         static void MessagePrint(string msg)
  21.         {
  22.             Console.WriteLine("[{0}], {1}", DateTime.Now.ToShortDateString(), msg);
  23.         }
  24.         static void LongRunning(MessagePrintDelegate mpd)
  25.         {
  26.             for (int i = 0; i != 99; i++)
  27.             {
  28.                 if (i % 10 == 0)
  29.                 {
  30.                     mpd(string.Format("Making progress. {0}% complete.", i));
  31.                 }
  32.             }
  33.         }
  34.         static int GetCount(Person obj1, Person obj2)
  35.         {
  36.             Random rdm = new Random();
  37.             return rdm.Next(); 
  38.         }
  39.         public class Person
  40.         { }
  41.     }
  42. }

 

2.委托的协变(covariance)是指一个委托方法能够返回派生数据类型的能力。

逆变(contravariance)是指委托方法能过以派生类为参数的能力。

 

3.匿名方法允许对一个委托进行实例化的同时定义方法。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace AnonMethods
  5. {
  6.     class Program
  7.     {
  8.         delegate void MessagePrintDelegate(string msg);
  9.         static void Main(string[] args)
  10.         {
  11.             MessagePrintDelegate mpd = new MessagePrintDelegate(MessagePrint);
  12.             LongRunning(mpd);
  13.             Console.WriteLine();
  14.             MessagePrintDelegate mpd2 = delegate(string msg)
  15.             {
  16.                 Console.WriteLine("[Anonymous] {0}", msg);
  17.             };
  18.             LongRunning(mpd2);
  19.             Console.WriteLine();
  20.             string source = "Outer";
  21.             MessagePrintDelegate mpd3 = delegate(string msg)
  22.             {
  23.                 Console.WriteLine("[{0}] {1}", source, msg);
  24.             };
  25.             LongRunning(mpd3);
  26.             
  27.         }
  28.         static void LongRunning(MessagePrintDelegate mpd)
  29.         {
  30.             for (int i = 0; i != 100; i++)
  31.             {
  32.                 if (i % 25 == 0)
  33.                 {
  34.                     mpd(string.Format("Process {0}% completed.", i));
  35.                 }
  36.             }
  37.         }
  38.         static void MessagePrint(string msg)
  39.         {
  40.             Console.WriteLine("[MessagePrint] {0}", msg);
  41.         }
  42.     }
  43. }

 

4.多播委托是通过对方法的委托进行组合而创建的。用+, -, +=, -=操作符。

原创粉丝点击