C# 委托(Delegate)

C# 委托(Delegate)

C# 委托(Delegate)

  1. 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);