C#多播委托/多播代理

定义:
委托是一种在对象里保存方法引用的类型,同时也是一种类型安全的函数指针。
理解委托的一种方式可以把委托的作用当作是给方法签名指定名称。
委托的定义类似于方法的定义,但没有方法体,定义的委托名前要加上关键字delegate。

因为定义委托基本上是定义一个新类,所以可以在定义类的任何地方定义委托,既可以在另一个类的内部定义委托,也可以在所有类的外部定义委托,还可以在命名空间中把委托定义为顶层对象。根据定义的可见性,可以在委托定义上添加一般的访问修饰符:public、private和protected等:

一个委托实例压缩(或者称为封装)了一个方法称之为“一个可调用的实体” ,所以“一个可调用的实体”也就由这个委托实例本身和实例中封装的方法组成

委托也可以包含多个方法,这种委托称为多播委托。

如果调用多播委托,就可以按顺序连续调用多个方法。为此,委托的签名就必须返回 void (否则,返回值应送到何处?)(当委托只包含一个方法的时候,其返回类型的声明可以参照所封装的方法,不一定必须是void)。实际上,如果编译器发现某个委托返回 void ,就会自动假定这是一个多播委托。

委托的优点:
(1)压缩方法的调用。

(2)合理有效地使用委托能提升应用程序的性能。

(3)用于调用匿名方法。

委托的声明:

作用域修饰符 delegate 委托返回类型 委托名();
如:public delegate  Void Test();

注意点:可以在不带参数或参数列表的情况下声明委托。应当遵循和声明方法一样的语法来声明委托.

委托的示例程序:

public delegate double Delegate_Prod(int a, int b);
class Class1
{
    static double fn_Prodvalues(int val1, int val2)
    {
        return val1 * val2;
    }
    static void Main(string[] args)
    {
        //Creating the Delegate Instance
        Delegate_Prod delObj = new Delegate_Prod(fn_Prodvalues);
        Console.Write("Please Enter Values");
        int v1 = Int32.Parse(Console.ReadLine());
        int v2 = Int32.Parse(Console.ReadLine());
        //use a delegate for processing
        double res = delObj(v1, v2);
        Console.WriteLine("Result :" + res);
        Console.ReadLine();
    }
}

解释:

上面我用一段小程序示范了委托的使用。委托Delegate_Prod声明时指定了两个只接受整型变量的返回类型。同样类中名为fn_Prodvalues的方法也是如此,委托和方法具有相同的签名和参数类型。

在Main方法中创建一个委托实例并用如下方式将函数名称传递给该委托实例:

Delegate_Prod delObj = new Delegate_Prod(fn_Prodvalues);

这样我们就接受了来自用户的两个值并将其传递给委托:

delObj(v1,v2);

在此委托对象压缩了方法的功能并返回我们在方法中指定的结果。

多播委托:

(1)多播委托包含一个以上方法的引用。

(2)多播委托包含的方法必须返回void,否则会抛出run-time exception。

多播委托的示例程序:
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApp1
{

    //声明一个委托
    public delegate void msg();

    //编写一个类
    class messges
    {
        //messges类下的一个成员方法m1
        public static void m1()
        { Console.WriteLine("方法一被huashanlin调用"); }

        //messges类下的一个成员方法m2
        public static void m2()
        { Console.WriteLine("方法二被huashanlin调用"); }

        //messges类下的一个成员方法m3
        public static void m3()
        { Console.WriteLine("方法3huashanlin被调用"); }
    }

    //另一个类
    class Program
    {
        
        //该类下包含的主函数
        static void Main(string[] args)
        {
            //实例化一个委托,并封装messges类中的一个方法m2
            msg ms = new msg(messges.m2);

            //在原有的封装了一个m1方法的委托实例中再封装进一个新的方法m1
            ms = ms + messges.m1;
            //或者上面的语句可以写成ms += messges.m1;两者的效果是一样的

            //以下为该委托实例封装第三个方法
            ms += messges.m3;

            //调用该委托实例,那么由于多播委托之后调用该委托就要执行完此封装进去的三个方法
            ms();

        }
    }
}

//注:deletge保存的方法签名是以hash队列的形式存在的

多播委托示例程序二:

delegate void Delegate_Multicast(int x, int y);

Class Class2

{
static void Method1(int x, int y) {
  Console.WriteLine("You r in Method 1");
}
static void Method2(int x, int y) {
  Console.WriteLine("You r in Method 2");
}
public static void Main() 
{
  Delegate_Multicast func = new Delegate_Multicast(Method1);

func += new Delegate_Multicast(Method2);
      func(1,2);             // Method1 and Method2 are called
      func -= new Delegate_Multicast(Method1);
      func(2,3);             // Only Method2 is called
   }

}

解析:

上面的示例程序分别定义了名为method1 和 method2的两个接受整型参数、返回类型为void的方法。

在Main函数里使用下面的声明创建委托对象:

Delegate_Multicast func = new Delegate_Multicast(Method1);

然后使用+= 来添加委托,使用-=来移除委托。

时间: 2024-10-07 02:26:50

C#多播委托/多播代理的相关文章

C# 泛型委托和多播委托

泛型委托的定义 泛型委托的作用可以使程序定义一个委托,满足多个需求,如需要定义一个int类型参数的委托和定义一个string类型类型的委托时,直接使用泛型,就可以减少多次定义委托 泛型委托定义时候只需要再方法名后加:<类型在方法中的名字> 类型可以是多个,多个类型之间用 ”,“ 逗号隔开 // 定义泛型委托 delegate void MyDelegate<T>(T str); // 定义返回值为泛型的委托 delegate Y MyDelegate1<T, Y>(T

Net中委托之二多播委托

本篇主要讲解多播委托 1.多播委托的实例 public class MyDelegate { private delegate int NoParameterWithReturn();//1.声明委托 public static void Show() { NoParameterWithReturn method = new NoParameterWithReturn(ShowSomething);//2.委托的实例化 //多播委托 method += ShowSomething;//按顺序添加

委托和多播委托

刚刚学习了委托的内容,先来说一下自己对委托的理解,权当是复习吧: 委托可以定义在类里面,也可以定义在类外面,如果定义在类里面就只能被这个类调用,不论声明它是public 还是private.如果定义在类外面就能被所有类调用.如果程序是多线程的,委托方法希望能在UI层调用,那么可以在命名空间下定义. //委托的声明 delegate关键字,这个委托只能代表返回值是空.参数是一个string类型的一个方法public delegate void GreetingDelegate(string nam

C#多播委托

概述 在上一篇文章中,笔者就个人理解的委托做了简单的分享,本篇文章主要来说说多播委托.多播委托即每个委托可以包含多个方法. 理解多播委托 多播委托可以保护多个方法,但是在使用的时候需要注意:委托的签名必须是返回void,否则只能调用最后一个方法的得到结果.多播委托派生自System.MulticastDelegate类,System.MulticastDelegate类又派生自System.Delegate.System.MulticastDelegate的其他成员可以允许把多个方法调用链接为一

委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托

在"委托.Lambda表达式.事件系列01,委托是什么,委托的基本用法,委托的Method和Target属性"中,反编译委托,发现委托都是多播委托. 既然委托是多播委托,我们可以通过"+="把多个方法赋给委托变量,这样就形成了一个委托链, 它是怎样形成的?来看下面的例子: namespace ConsoleApplication3 { internal delegate void MySayDel(string msg); class Program { stati

多播委托和匿名方法再加上Lambda表达式

多播委托就是好几个方法全都委托给一个委托变量 代码: 1 namespace 委托 2 { 3 class Program 4 { 5 static void math1() 6 { 7 Console.WriteLine("这是第一个方法"); 8 } 9 10 static void math2() 11 { 12 Console.WriteLine("这是第二个方法"); 13 } 14 15 static void Main(string[] args) 1

从多播委托到事件

一.多播委托 前文提到的委托只是在一个委托类型中存储了一个方法(函数),实际上一个委托变量可以同时绑定多个方法,这些委托形成了一个委托链,每一个委托(实际上是方法)都顺序指向下一个委托,这个委托链就是多播委托. 每一个绑定的方法就像是订阅者一样,等着发布者的消息,而触发委托变量的那个就像是发布者,将出发的信号传给所有的订阅者. 1.订阅者 考虑一个温度控制器的例子,这个控制器拥有两个调温器,一个加热器,当温度低于指定的值时,启动,一个冷却器,当温度高于指定的温度时,启动.二者的类设计如下: 1

委托三------------多播委托与匿名方法

============================================多播委托 -------------------------------------主程序 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication3 {     class Pr

多播委托

首先定义两个委托和几个方法,后面会用到. 委托: 1 public delegate void M1Delegate(); 2 3 public delegate int M2Delegate(int x,int y); 方法: 1 static int A1(int x,int y) 2 { 3 return x + y; 4 } 5 6 static int A2(int x, int y) 7 { 8 return x + y; 9 } 10 11 static int A3(int x,