C#中的多播委托和泛型委托_C#教程

首页 / 新闻资讯 / 正文

First Vector Graphic

多播委托

简介

  • 每一个委托都是继承自MulticastDelegate,也就是每个都是多播委托。
  • 带返回值的多播委托只返回最后一个方法的值
  • 多播委托可以用加减号来操作方法的增加或者减少。
  • 给委托传递相同方法时 生成的委托实例也是相同的(也就是同一个委托)

代码实现

 	//声明委托      delegate void MulticastTest();      public class MulticastDelegateTest      {                                  public void Show()          {              MulticastTest multicastTest = new MulticastTest(MethodTest);              multicastTest();                    Action action =new Action(MethodTest);              action = (Action)MulticastDelegate.Combine(action, new Action(MethodTest2));              action = (Action)MulticastDelegate.Combine(action, new Action(MethodTest3));              action = (Action)MulticastDelegate.Remove(action, new Action(MethodTest3));              action();                //等同于上面              action = MethodTest;              action += MethodTest2;              action += MethodTest3;              action -= MethodTest3;                foreach (Action action1 in action.GetInvocationList())              {                  action1();              }              Console.WriteLine("==========");              action();                                            Func<string> func = () => { return "我是Lambda"; };              func += () => { return "我是func1"; };              func += () => { return "我是func2"; };              func += GetTest;              func += GetTest; //给委托传递相同方法时 生成的委托实例也是相同的(也就是同一个委托)                            string result = func();              Console.WriteLine(result);              Console.WriteLine("==========");          }              #region 委托方法          public void MethodTest()          {              Console.WriteLine("我是方法MethodTest()1");          }            public void MethodTest2()          {              Console.WriteLine("我是方法MethodTest()2");          }            public void MethodTest3()          {              Console.WriteLine("我是方法MethodTest()3");          }            public string GetTest()          {              return "我是方法GetTest()";          }          #endregion      }

泛型委托

代码实现

    //泛型委托声明      delegate void GenericDelegate<T>(T t);      public class GenericDelegate      {          public static void InvokeDelegate()          {              GenericDelegate<string> genericDelegate = new GenericDelegate<string>(Method1);              genericDelegate("我是泛型委托1");                //官方版本(不带返回值)              Action<string> action = new Action<string>(Method1);              action("我是泛型委托1");              //Action<string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string>                GenericDelegate<int> genericDelegate1 = new GenericDelegate<int>(Method2);              genericDelegate1(2);                //官方版本(带回值)              Func<string, string> func = new Func<string, string>(Method3);              string ret = func("我是带返回值Func委托");              Console.WriteLine( ret );              //Func<string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string,string>          }                #region 委托方法            public static void Method1(string str)          {              Console.WriteLine(str);          }            public static void Method2(int num)          {              Console.WriteLine("我是泛型委托2 "+num);          }            public static string Method3(string str )          {              return str;          }            #endregion      }