直接上实例。代码含有注释。
//类型A,内有一个函数
class A { public void Close_A() { Console.WriteLine("Close_A"); } }
//类型B,里面有一个函数。
class B { public void Close_B() { Console.WriteLine("Close_B"); } }
//类型C,里面有一个静态方法
class C { static public void Static_Close_C() { Console.WriteLine("Static_Close_C"); } }
class Controller { //委托关键字 定义委托类型。 可以加参数列表 delegate void stop_Con(); //用委托类型定义委托变量 private stop_Con stop_con1; //构造函数中,对委托加入方法。 public Controller() { //加入委托前,必须保证方法实例化,静态函数除外 a1 = new A(); b1 = new B(); //委托指向的方法,参数列表和返回值,需要和委托定义的保持一致 //委托返回类型是void,参数是空。(Close_A的返回值也必须是Void,参数也必须是空,否则报错) //多播委托,返回值基本上都是VOID, this.stop_con1 += a1.Close_A; //this.stop_con1 += new stop_Con(a1.Close_A); //意思同上 this.stop_con1 += b1.Close_B; //静态方法,直接用类名 this.stop_con1 += C.Static_Close_C; } private A a1;//定义类A的引用a1 private B b1;//B类引用b1 public void Close() { //调用定义的委托变量,实际就是调用,a1.Close_A() 和 b1.Close_B和C.Static_Close_C():; this.stop_con1(); } }
static void Main(string[] args) { Controller con = new Controller(); con.Close(); }
还可以通过属性的方法调用委托。或者通过函数参数给传递委托。
class Controller { //委托关键字 定义委托类型。 可以加参数列表 public delegate void stop_Con(); //用委托类型定义委托变量 private stop_Con stop_con1; //通过函数调用委托,委托之间可以进行加减运算 public void Add(stop_Con s) { stop_con1+=s; }
public void Remove(stop_Con s) { stop_con1 -= s; } //通过属性的方法调用委托,此时委托类型的定义,需要声明为public public stop_Con Stop_con1 { get { return stop_con1; } set { this.stop_con1 = value; } } private A a1;//定义类A的引用a1 private B b1;//B类引用b1 }
static void Main(string[] args) { A a1=new A(); Controller con = new Controller(); con.Stop_con1 += a1.Close_A; B b1 = new B(); con.Add(b1.Close_B); con.Stop_con1(); }