C# 委托(Delegate)
C# 委托(Delegate)
-
C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。
委托(Delegate)
是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。
(我自己的理解就是让别人干活,相当于外包)
委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。
我们共分为三种委托方式
一:Delegate传统委托 方式
Delegate 委托需要先进行定义,定义完成,实例化出委托的数据名称,然后再进行指定,由此可见灰常的麻烦。
Delegete传统委托:传统委托类型必须要有返回值,且委托参数要一致
代码:
class ProGrent
//传统委托类型
delegate void Deate();//定义一个无参数的没有返回值的委托类型
delegate int Int_Deate();//定义一个无参数的返回值为int类型的委托类型
delegate int Int_date_2(int Vulage);//定义一个有参数返回值类型为int类型的委托类型
static void Main()
Deate Fuaa = null; //定义类型为Deate 名称为Fuaa类型的委托变量
Int_Deate int_dea_1 = null;//定义类型为Int_Deate 名称为int_dea_1类型的委托变量
Int_date_2 int_dea_2 = null;//定义类型为Int_date_2 名称为int_dea_2类型的委托变量
Fuaa = Funaa; //将Funaa的名称空间指定给Fuaa委托
Fuaa(); //调用委托的方法
int_dea_1 = Int_fua;
int_dea_1();
Console.WriteLine(int_dea_1());
int_dea_2 = Int_fua_2;
int_dea_2(3);
Console.WriteLine(int_dea_2(3));
//无参无返回值方法
private static void Funaa()
Console.WriteLine("Hello World");
//有返回值无参数方法
private static int Int_fua()
return 5;
//有返回值有参数方法
private static int Int_fua_2(int Volue)
return Volue * Volue;
}
二:Action委托方式
Action委托方式不需要定义,不需要有返回值(也不能有返回值),当使用多参数传参的时候,使用泛型<>完美解决
Action委托:不能使用返回值,且参数可以随意传
代码
class Action_file
static void Main(string[] args)
Action Data = Fua; //无参数
Data();
Action<int, string> Date_2 = Funac; //利用泛型<>传入参数
Date_2(5,"和为:");
private static void Fua()
Console.WriteLine("hello World");
private static void Funac(int Velune,String Str)
Console.WriteLine(string.Format("{0}{1}+{1}", Str, Velune));
三:Func委托方式
Func委托需要使用返回值,且如果使用参数,那么返回值类型要在参数的最后面
代码
class Func_class
static void Main(string[] args)
Func<string> Str_date = Date_String;
Str_date();
Console.WriteLine(Str_date());
Func<int, int, string> Str_date_s = Date_String_s;
Str_date_s(3, 799);
Console.WriteLine(Str_date_s(3, 799));
//无参数有返回值
private static string Date_String()
return "返回值为String 类型";
//多个参数有返回值
private static string Date_String_s(int vulue, int Num)
return string.Format("{0},{1}", vulue, Num);
}
注意(委托就是个外包公司)
二:委托的多播
委托的多播(Multicasting of a Delegate)
委托对象可使用 "+" 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。"-" 运算符可用于从合并的委托中移除组件委托。
使用委托的这个有用的特点,您可以创建一个委托被调用时要调用的方法的调用列表。这被称为委托的 多播(multicasting) ,也叫组播。下面的程序演示了委托的多播:
委托多播实例:例如小明叫小张买完车票,之后接着又让他带张电影票。
public delegate void DoSomeThing();
public class MrZhang {
public static void HelpWith(DoSomeThing callback) {
// 小张的唯一方法,帮别人做某事;
Console.WriteLine("小张帮====》");
callback();
public class MrMing
public static void BuyTicket() {
Console.WriteLine("小明买了一张火车票");
public static void BuyMovieTicket() {
Console.WriteLine("小明买了一张电影票");
public static void Main() {
// 定义两件事,是小明需要去做的事
DoSomeThing thing1 = new DoSomeThing(BuyTicket);
DoSomeThing thing2 = new DoSomeThing(BuyMovieTicket);
// 让小张去做这两件事
thing1 += thing2;
MrZhang.HelpWith(thing1);