namespace DelegateSample { //1,委托实质上是一个类,它继承自System.MulticastDelegate //2,我们可以在任何声明类的地方声明一个委托。 //3,声明委托使用delegate关键字 //4,注册到委托的方法的签名必须跟委托一致,这就是为什么说c#中的委托是类型安全的。 //(这里的签名包括返回值和参数类型及参数个数。) public delegate void Log(string message);//声明委托 class UserService { public Log LogDelegate { get; set; }//前面定义的Log类型的委托的变量。 public UserService() { } public void Register(User user) { if (user.Name == "Kirin") { //像调用方法那样让委托执行。 LogDelegate("注册失败,已经包含名为" + user.Name + "的用户"); } else { LogDelegate("注册成功!"); } } } class Program { static void Main(string[] args) { User user = new User { Name = "Kirin", Password = "123" }; UserService service = new UserService(); //把静态方法LogToConsole注册到委托。 service.LogDelegate = LogToConsole; Program p = new Program(); //把实例方法LogToTextFile注册到委托。 //委托可以保持多个对象的引用(这里是多个方法)。 service.LogDelegate += p.LogToTextFile; //在这个方法内将会调用Log委托的实例LogDelegate service.Register(user); Console.ReadLine(); } static void LogToConsole(string message) { Console.WriteLine(message); } void LogToTextFile(string message) { using (StreamWriter sw = File.AppendText("log.txt")) { sw.WriteLine(message); sw.Flush(); sw.Close(); } } } }