在C#中,委托时包含方引用的引用类型。可以将委托认为是指向函数的指针。
不是直接调用该函数,而是使用委托指向该函数,然后通过调用委托来调用该方法。
为了理解委托的用途,首先查看调用函数的常规方式。考虑如下的程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Demo_Delegate
{
class Program
{
static void Main(string[] args)
{
int num1 = 5;
int num2 = 3;
Console.WriteLine(Add(num1, num2).ToString());
Console.WriteLine(Subtract(num1, num2).ToString());
Console.ReadKey();
}
static int Add(int num1, int num2)
{
return (num1 + num2);
}
static int Subtract(int num1, int num2)
{
return (num1 - num2);
}
}
}
该程序包含3个方法:Main()、Add()、Subtract()。注意到Add() 和 Subtract() 方法都有相同的签名。在Main() 方法中都可以调用:
Console.WriteLine(Add(num1, num2).ToString());
Console.WriteLine(Subtract(num1, num2).ToString());
现在创建与Add() 方法有相同签名的委托类型:
namespace Demo_Delegate
{
class Program
{
delegate int MethodDelegate(int num1, int num2);
static void Main(string[] args)
{
使用关键字 delegate 定义委托类型,类似于函数的声明,但是委托没有函数主体。
为了使委托指向函数,可以创建委托类型的对象如下:
static void Main(string[] args)
{
int num1 = 5;
int num2 = 3;
MethodDelegate method1 = new MethodDelegate(Add);
Console.WriteLine(method1(num1, num2).ToString());
也可以将函数名直接赋值给对象:
MethodDelegate method2 = Subtract;
Console.WriteLine(method2(num1, num2).ToString());
委托的优点在于可以使委托调用他所指向的任何函数,并且在实际运行之前都不需要确切地了解它调用的函数。
委托指向任何函数,前提是该函数的签名匹配委托的签名。
完整代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Demo_Delegate
{
class Program
{
delegate int MethodDelegate(int num1, int num2);
static void Main(string[] args)
{
int num1 = 5;
int num2 = 3;
MethodDelegate method1 = new MethodDelegate(Add);
Console.WriteLine(method1(num1, num2).ToString());
MethodDelegate method2 = Subtract;
Console.WriteLine(method2(num1, num2).ToString());
Console.ReadKey();
}
static int Add(int num1, int num2)
{
return (num1 + num2);
}
static int Subtract(int num1, int num2)
{
return (num1 - num2);
}
}
}