在C#中,委托与类,接口是同一级别的。
    1, 委托:方法的模板。
          定义:没有方法体的方法,即只有方法的声明。与抽象方法的声明相同,只需将abstract更改为delegate即可。
例:public delegate void SayHi (string name ) ;该例子定义了一个SayHi类型的委托(其实就是一个返回值为void,参数为string类型的方法的声明,只是多了个delegate 而已,我想是为了叫起来方便,所以管它叫委托。为什么非得叫这个名字,就得问C#的创造者了)。为了方便访问和重用,委托一般是放在命名空间下的。如果你想写在类的内部,随你高兴就好。
          实例:与类的实例一样使用new关键字,不同的是委托只有带参的实例函数,在new的同时就需要传递参数。最大的不同是参数只能是方法名(在C#2.0中匿名方法也可以)。如:SayHi say = new SayHi(Hello);或SayHi say = new SayHi(delegate (string name){ Console.WriteLine(name+"说:hello!");});
        public void Hello (string name)
       {
               Console.WriteLine(name+"说:hello!");
        }
        使用:委托实例名(参数),如 say (name); Hello方法和匿名方法的参数在使用实例委托时指定,name为string类型(我觉得完全多余,这句话)。到这里进入重点了,委托在没有实例化的情况下使用不会引发编译异常的,但是会引发运行时异常。异常叫空引用。所以一般在都会加个非空判断,如:if(say != null){ say (name);}。这样当它还未实例化时使用,就不会让程序中断了。
        运算符:+,+=,=,-,-=(减等)可用于委托。比如说,
SayHi say = new SayHi(Hello);
say += new SayHi(delegate (string name){ Console.WriteLine(name+"说:hello!")};);
        也可以这样:
SayHi say1 = new SayHi(Hello);
SayHi say2 = new SayHi(Hello1);( Hello1方法和Hello一样,我不想多打字了)。
SayHi say = say1 + say2;
        也就是说委托可以引用多个实例,规则是方法的返回值必须为void才行,这个叫多播委托如果不是的话,编译器会提醒你的。使用多播实例时只需写一次即可执行所有引用的方法,参数为共享,按实例化先后顺序执行引用方法。- , -=是用来移除实例引用的,这个就不多说了。
        另外,可以定义委托数组。SayHi[] sh = {new SayHi(Hello), new SayHi(Hello1)};通过数组下标访问sh[0]("liang")就是引用执行Hello方法了。这时结果为:liang说:hello!。