C#中的委托类似于C++中的函数指针,是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。
委托包含两部分,委托的声明和委托的实例化。
委托的声明示例如下:
public delegate string printString(string str);
委托的实例有两种方式,一种是通过new的方式创建,另一种方式是通过"+="注册的方式创建。
通过new创建实例的示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
internal class Program
{
public delegate string printString(string str);
public string PrintOK(string str)
{
string newStr = str + " OK";
return newStr;
}
public string PrintError(string str)
{
string newStr = str + " Error";
return newStr;
}
public void printInfo(string str)
{
printString ps1 = new printString(PrintOK);
printString ps2 = new printString(PrintError);
Console.WriteLine(ps1(str));
Console.WriteLine("---------------------");
Console.WriteLine(ps2(str));
Console.WriteLine("---------------------");
}
static void Main(string[] args)
{
Program p = new Program();
p.printInfo("hello");
Console.ReadKey();
}
}
}
返回值如下:
hello OK
---------------------
hello Error
---------------------
通过"+="注册的方式创建实例的示例:
说明:通过+=方式注册的函数都会被执行,但是假如delegate方法有返回值,则只返回最后一次注册的返回值。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
internal class Program
{
public delegate int addNum(int i);
public static int num = 0;
public int addOne(int i)
{
num += 1;
return i + 1;
}
public int addTwo(int i)
{
num += 2;
return i + 2;
}
public int addNumResult(int i)
{
addNum an = null;
an += addOne;
an += addTwo;
return an(i);
}
static void Main(string[] args)
{
Program p = new Program();
int result = p.addNumResult(10);
Console.WriteLine(result);
Console.WriteLine(num);
Console.ReadKey();
}
}
}
此时返回:
12(代表只返回最后一个注册函数的值)
3(代表所有的注册函数都执行了一遍)