C# 委托和事件
程序员文章站
2024-02-25 21:27:39
...
.Net Framework的编码规范:
1. 委托类型的名称都应该以EventHandler结束。
2. 委托的原型定义:有一个void返回值,并接受两个输入参数:一个Object 类型,一个 EventArgs类型(或继承自EventArgs)。
3. 事件的命名为 委托去掉 EventHandler之后剩余的部分。
4. 继承自EventArgs的类型应该以EventArgs结尾。
委托
委托的声明方式和类完全不同,实际上,委托在编译的时候确实会编译成类。因为Delegate是一个类,所以在任何可以声明类的地方都可以声明委托。
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
class Program
{
delegate void MyDelegate(string message);
public class Example
{
public void Method(string message)
{
Console.WriteLine(message);
}
}
static void Main(string[] args)
{
Example example = new Example();
MyDelegate myDelegate = new MyDelegate(example.Method);
myDelegate("Hello World!");//或者 myDelegate.invoke("Hello World!")
Console.ReadKey();
}
}
带返回值的委托
当建立委托对象时,委托的返回值必须与委托方法相对应。使用下面的例子,方法将返回 “Hello Gnd” 。
class Program
{
delegate string MyDelegate(string message);
public class Example
{
public string Method(string name)
{
return "Hello " + name;
}
}
static void Main(string[] args)
{
Example example = new Example();
//绑定委托方法
MyDelegate myDelegate = new MyDelegate(example.Method);
//调用委托,获取返回值
string message = myDelegate("Gnd");
Console.WriteLine(message);
Console.ReadKey();
}
}
事件
事件能通过+=和-=两个方式注册或者注销对其处理的方法,使用+=与-=操作符的时候,系统会自动调用对应的 add_XXX、remove_XXX 进行处理。注意:在事件所处的对象之外,事件只能出现在+=,-=的左方。
public delegate void MyDelegate(string name);
public class PersonManager
{
public event MyDelegate MyEvent;
//执行事件
public void Execute(string name)
{
if (MyEvent != null)
MyEvent(name);
}
}
class Program
{
static void Main(string[] args)
{
PersonManager personManager = new PersonManager();
//绑定事件处理方法
personManager.MyEvent += new MyDelegate(GetName);
personManager.Execute("Gnd.");
Console.ReadKey();
}
public static void GetName(string name)
{
Console.WriteLine("My name is " + name);
}
}