C#委托与事件(详解)
什么是委托?
在C#中,委托是一个类,用于指向和调用一个或多个方法。可以将委托看做是方法的类型。通过委托,我们可以在运行时确定要调用哪个方法,而无需提前确定调用哪个方法。
如何定义委托?
在C#中,委托的定义非常简单,只需使用delegate
关键字即可。
delegate 返回类型 委托名称(参数列表);
其中,
返回类型
:委托指向方法的返回值类型;委托名称
:定义的委托名称;参数列表
:委托指向方法的参数列表。
委托名称可以自定义,建议名称要见名知意。例如,要定义一个委托来作为一个方法的回调函数,可以这样写:
delegate void Callback(string arg1, int arg2);
如何使用委托?
定义了一个委托之后,就可以使用它来指向方法了。委托指向方法的语法为:
委托名称 变量名称 = new 委托名称(方法名);
其中,
委托名称
:先前定义的委托名称;变量名称
:委托变量的名称;方法名
:要指向的方法的名称。
例如,要使用上文定义的Callback
委托来指向一个名为DoSomething
的方法,可以这样写:
Callback callback = new Callback(DoSomething);
在这个例子中,DoSomething
方法的定义如下:
void DoSomething(string arg1, int arg2)
{
Console.WriteLine("DoSomething called! arg1 = {0}, arg2 = {1}", arg1, arg2);
}
然后,我们可以使用callback
委托变量来调用DoSomething
方法,如下所示:
callback("hello", 123);
什么是事件?
在C#中,事件是一种特殊的委托,它代表了一组在对象上发生的动作或操作。当事件在对象上触发时,订阅者(或观察者)将收到通知,并有机会执行相应的动作或操作。
如何定义事件?
在C#中,事件的定义遵循以下模式:
public event 委托名称 事件名称;
其中,
public
:事件的访问修饰符,用于控制事件的可见性;event
:事件关键字;委托名称
:前面定义的委托名称,用于指定事件的处理程序类型;事件名称
:事件的名称。
例如,要定义一个事件来处理一个名为EventName
的事件,可以这样写:
public event EventHandler EventName;
在这个例子中,使用了C#内置的EventHandler
委托类型,它具有以下签名:
public delegate void EventHandler(object sender, EventArgs e);
在事件发生时,触发事件的对象会将自己作为sender
参数传递给事件处理程序,同时生成一个EventArgs
实例作为e
参数传递给事件处理程序。
如何订阅事件?
订阅事件是指将一个或多个方法注册为事件处理程序,以便在事件发生时能够接收通知并执行相应的操作。
在C#中,可以使用以下语法来订阅事件:
对象实例.事件名称 += 事件处理程序方法;
其中,
对象实例
:触发事件的对象实例;事件名称
:要订阅的事件名称;事件处理程序方法
:一个能够响应事件的方法。
例如,要订阅上文定义的EventName
事件,可以这样写:
obj.EventName += new EventHandler(EventHandlerMethod);
在这个例子中,EventHandlerMethod
是一个能够响应EventName
事件的方法,定义如下:
void EventHandlerMethod(object sender, EventArgs e)
{
Console.WriteLine("Event has occurred!");
}
当EventName
事件发生时,EventHandlerMethod
方法将被调用。
如何触发事件?
在C#中,可以使用以下语法来触发事件:
事件名称?.Invoke(发送事件的对象, EventArgs实例);
其中,
事件名称
:要触发的事件名称;发送事件的对象
:触发事件的对象实例;EventArgs实例
:事件参数。
例如,要触发上文定义的EventName
事件,可以这样写:
EventName?.Invoke(this, EventArgs.Empty);
this
表示当前对象实例,EventArgs.Empty
表示没有任何事件数据。
示例1:使用委托实现函数指针
在这个示例中,我们将演示如何使用委托来实现函数指针。
using System;
namespace Demo1
{
delegate void Callback();
class Program
{
static void Main(string[] args)
{
Callback callback = new Callback(SayHello);
callback();
}
static void SayHello()
{
Console.WriteLine("Hello World!");
}
}
}
在这个示例中,我们定义了一个Callback
委托类型,它能够指向没有参数、没有返回值的方法。然后,我们创建了一个callback
委托变量,并将它指向一个名为SayHello
的方法。最后,我们使用callback
委托变量来调用SayHello
方法。
示例2:使用事件处理程序
在这个示例中,我们将演示如何使用事件处理程序在不同对象之间通信。
using System;
namespace Demo2
{
public class Button
{
public event EventHandler Click;
public void OnClick()
{
Click?.Invoke(this, EventArgs.Empty);
}
}
public class MainForm
{
private Button button;
public MainForm()
{
button = new Button();
button.Click += new EventHandler(ButtonClick);
}
private void ButtonClick(object sender, EventArgs e)
{
Console.WriteLine("Button clicked!");
}
public void Run()
{
button.OnClick();
}
}
class Program
{
static void Main(string[] args)
{
MainForm mainForm = new MainForm();
mainForm.Run();
}
}
}
在这个示例中,我们定义了两个类,一个名为Button
,另一个名为MainForm
。Button
类有一个名为Click
的公共事件,表示当按钮被点击时发生的事件。MainForm
类将Button
实例化,并订阅了Click
事件。
在MainForm
类的ButtonClick
方法中,打印了“Button clicked!”的文本。在MainForm
类的Run
方法中,OnClick
方法被调用,从而触发Click
事件。因为MainForm
已经订阅了Click
事件,并且已经实现了ButtonClick
方法,所以在按钮被单击时,它将打印“Button clicked!”的文本。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#委托与事件(详解) - Python技术站