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();
}
}
}
}