C# 语言中的委托和事件是其一大特色,委托和事件在 Windows 窗体应用程序、 ASP.NET 应用程序、WPF 应用程序等应用中是最为普遍的应用。
通过定义委托和事件可以方便方法重用,并提高程序的编写效率。
C# 中的委托类似于 C 或 C++ 中函数的指针。委托是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。
事件基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些出现,如系统生成的通知等。
C#委托(Delegate)简介
委托从字面上理解就是一种代理,类似于房屋中介,由租房人委托中介为其租赁房屋。
在 C# 语言中,委托则委托某个方法来实现具体的功能。
委托是一种引用类型,虽然在定义委托时与方法有些相似,但不能将其称为方法。
委托在使用时遵循三步走的原则,即定义声明委托、实例化委托以及调用委托。
从数据结构来讲,委托是和类一样是一种用户自定义类型。
委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址。
调用委托的时候,委托包含的所有方法将被执行。
委托是 C# 语言中的一个特色,通常将委托分为命名方法委托、多播委托、匿名委托,其中命名方法委托是使用最多的一种委托。
C#命名方法委托
在 C# 语言中命名方法委托是最常用的一种委托,其定义的语法形式如下。
修饰符 delegate 返回值类型 委托名 ( 参数列表 );
从上面的定义可以看出,委托的定义与方法的定义是相似的。例如定义一个不带参数的委托,代码如下。
public delegate void MyDelegate();
在定义好委托后就到了实例化委托的步骤,命名方法委托在实例化委托时必须带入方法的具体名称。
实例化委托的语法形式如下。
委托名 委托对象名 = new 委托名 ( 方法名 );
委托中传递的方法名既可以是静态方法的名称,也可以是实例方法的名称。
需要注意的是,在委托中所写的方法名必须与委托定义时的返回值类型和参数列表相同。
在实例化委托后即可调用委托,语法形式如下。
委托对象名 ( 参数列表 );
在这里,参数列表中传递的参数与委托定义的参数列表相同即可。
【实例 1】创建委托,在委托中传入静态方法于控制台输出“Hello Delegate!”。
class Program
{
public delegate void MyDelegate();
static void Main(string[] args)
{
//若使用静态方法,在向委托中传递方法名时只需要用“类名.方法名”的形式。
MyDelegate myDelegate = new MyDelegate(Test.SayHello);
myDelegate();
}
}
class Test
{
public static void SayHello()
{
Console.WriteLine("Hello Delegate!");
}
}
【实例 2】将实例 1 中的静态方法改成实例方法。
class Program
{
public delegate void MyDelegate();
static void Main(string[] args)
{
//由于在委托中使用的是实例方法,则需要通过类的实例来调用方法,即使用“new 类名 (). 方法名”的形式。
//除了使用匿名对象的方式调用方法以外,也可以先创建类的实例,再通过类的实例调用方法。
MyDelegate myDelegate = new MyDelegate(new Test().SayHello);
myDelegate();
}
}
class Test
{
public void SayHello()
{
Console.WriteLine("Hello Delegate!");